library(ggplot2)
library(sf)
library(dplyr)
library(tidyverse)
library(tidycensus)
library(tigris)
library(tidyr)
options(tigris_use_cache = TRUE)

What is an “LCSA,” why does it matter and how was it made? A combined statistical area is two adjacent metropolitan or micropolitan statistical areas that have an employment interchange measure (EIM) of at least 15. This research coins the phrase ‘large combined statistical area’ or LCSA, defined as only those CSAs that contain a metropolitan area. The LSCA is used here as a way to narrow the researcher’s scale to an area that contains a population that is engaged in dynamic inter-county activity, such as concievably relocating to be closer to work or to buy a home for a new family. It is thought that this is an insightful way to learn more about housing costs over the 2010s. However, as the boundaries of a CSA ‘float’ every three to five years, customized LCSAs that contain all the counties that were ever part of an LCSA from 2010 through 2019 were made and statistics derived from county estimates were calculated.

mapping_example <- map_dfr(c("AL","GA","TN"),
                   ~{counties(.x, cb = TRUE, year = 2010)})
Using FIPS code '01' for state 'AL'
Using FIPS code '13' for state 'GA'
Using FIPS code '47' for state 'TN'
mapping_example_CSA_09to13 <- combined_statistical_areas(cb = FALSE, year = 2011) %>%
  filter(str_detect(NAME, "AL") | str_detect(NAME, "GA") | str_detect(NAME, "TN")) %>% 
  filter(NAMELSAD == "Chattanooga-Cleveland-Athens, TN-GA CSA")

mapping_example_muni_09to13 <- core_based_statistical_areas(year = 2011) %>% 
  filter(str_detect(NAME, "AL") | str_detect(NAME, "GA") | str_detect(NAME, "TN")) %>%
  filter(str_detect(NAMELSAD, "Metro"))

example_09to13 <- ggplot() + 
  geom_sf(data = mapping_example, fill = "lightgray", color = "gray") +
  geom_sf(data = mapping_example_muni_09to13, fill = "green", color = "green") +
  geom_sf(data = mapping_example_CSA_09to13, fill = NA, color = "red") +
  theme_void()

Example from 09 to 13 ref map

example_09to13

mapping_example_CSA_13to18 <- combined_statistical_areas(cb = FALSE, year = 2015) %>%
  filter(str_detect(NAME, "AL") | str_detect(NAME, "GA") | str_detect(NAME, "TN")) %>% 
  filter(NAMELSAD == "Chattanooga-Cleveland-Dalton, TN-GA-AL CSA")

mapping_example_muni_13to18 <- core_based_statistical_areas(year = 2015) %>% 
  filter(str_detect(NAME, "AL") | str_detect(NAME, "GA") | str_detect(NAME, "TN")) %>%
  filter(str_detect(NAMELSAD, "Metro"))

example_13to18 <- ggplot() + 
  geom_sf(data = mapping_example, fill = "lightgray", color = "gray") +
  geom_sf(data = mapping_example_muni_13to18, fill = "green", color = "green") +
  geom_sf(data = mapping_example_CSA_13to18, fill = NA, color = "red") +
  theme_void()

Example from 13 to 18 ref map

example_13to18

mapping_example_CSA_18to20 <- combined_statistical_areas(cb = FALSE, year = 2019) %>%
  filter(str_detect(NAME, "AL") | str_detect(NAME, "GA") | str_detect(NAME, "TN")) %>% 
  filter(NAMELSAD == "Chattanooga-Cleveland-Dalton, TN-GA CSA" |
         NAMELSAD == "Scottsboro-Fort Payne, AL CSA")

mapping_example_muni_18to20 <- core_based_statistical_areas(year = 2019) %>% 
  filter(str_detect(NAME, "AL") | str_detect(NAME, "GA") | str_detect(NAME, "TN")) %>%
  filter(str_detect(NAMELSAD, "Metro"))

example_18to20 <- ggplot() + 
  geom_sf(data = mapping_example, fill = "lightgray", color = "gray") +
  geom_sf(data = mapping_example_muni_18to20, fill = "green", color = "green") +
  geom_sf(data = mapping_example_CSA_18to20, fill = NA, color = "red") +
  theme_void()

Example from 18 to 20 ref map

example_18to20

customized <- read_csv("LCSA_cut.csv")
Missing column names filled in: 'X1' [1]
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
cols(
  X1 = col_double(),
  year = col_double(),
  GEOID = col_character(),
  NAME = col_character(),
  variable = col_character(),
  estimate = col_double(),
  moe = col_double(),
  NAMELSAD = col_character()
)
cut <- customized$GEOID

mapping_example_pre_cut <- mapping_example %>% select(GEOID = GEO_ID, geometry)

mapping_example_cut <- mapping_example_pre_cut %>% separate(GEOID, c("nope", "GEOID"), "US") %>%
  select(-"nope")

mapping_example2 <- filter(mapping_example_cut, GEOID %in% cut)

mapping_example3 <- geo_join(mapping_example2, customized, by = c("GEOID")) %>% 
  filter(., GEOID %in% cut)

mapping_example4 <- mapping_example3 %>% mutate(group = case_when(TRUE ~ NAMELSAD))

mapping_example4 <- group_by(mapping_example4, group) %>% 
    summarize(do_union = TRUE) %>% filter(!is.na(.)) %>% 
    filter(group == "Chattanooga-Cleveland-Dalton, TN-GA-AL CSA")
`summarise()` ungrouping output (override with `.groups` argument)
customized_example2 <- ggplot() + 
  geom_sf(data = mapping_example, fill = "lightgray", color = "gray") +
  geom_sf(data = mapping_example4, fill = "red", color = NA) +
  theme_void()

Custom 2010s LCSA

customized_example2

costs <- customized %>%
  pivot_wider(., id_cols = c("year", "GEOID", "NAME", "NAMELSAD"),
              names_from = variable, values_from = c("estimate", "moe")) %>%
  select(year, GEOID, NAME, NAMELSAD,
         RentCost = estimate_B25071_001,             RentCostMOE = moe_B25071_001,
         MortgagorCost = estimate_B25092_002,        MortgagorCostMOE = moe_B25092_002,
         OwnerCost = estimate_B25092_003,            OwnerCostMOE = moe_B25092_003,
         MedianMortAndOwnCost = estimate_B25092_001, MedianMortAndOwnMOE = moe_B25092_001,
         Renters = estimate_B25003_003,              RentersMOE = moe_B25003_003,
         Mortgagors = estimate_B25081_002,           MortgagorsMOE = moe_B25081_002,
         Owners = estimate_B25081_008,               OwnersMOE = moe_B25081_008,
         MortAndOwn = estimate_B25003_002,           MortAndOwnMOE = moe_B25003_002,
         OccupiedTotal = estimate_B25003_001,        OccupiedTotalMOE = moe_B25003_001,
         MedianHousingCost = estimate_B25105_001,    MedianHousingCostMOE = moe_B25105_001) %>%
  filter(!is.na(NAMELSAD))

costs2 <- costs %>% select(year, GEOID, NAME, NAMELSAD, RentCost, MortgagorCost, OwnerCost, MedianMortAndOwnCost,
                           Renters, Mortgagors, Owners, MortAndOwn, OccupiedTotal, MedianHousingCost)

head <- costs2 %>% filter(is.na(MortgagorCost))

Recoding zeros for mortgagor costs due to the county essentially containing no mortgagors, this recoding only pertains to Kenedy County

head(head)
index <- is.na(costs2)
costs2[index] <- 0
head <- costs2 %>% filter(str_detect(NAME, "Kenedy County, Texas"))
head(head)

“CostFirst” weights resident cohorts’ costs by their prevelance; differientiates between renters, mortgagors and owners, I’m very partial to this method over the “CostSecond” method that uses the variable with the mortgagors and owners lumped together

costs3 <- costs2 %>%
  select(year, GEOID, NAME, NAMELSAD, RentCost, MortgagorCost, OwnerCost, MedianMortAndOwnCost,
         Renters, Mortgagors, Owners, MortAndOwn, OccupiedTotal, MedianHousingCost) %>%
  mutate(RentersOverTotal    = Renters         /OccupiedTotal) %>% 
  mutate(MortgagorsOverTotal = Mortgagors      /OccupiedTotal) %>% 
  mutate(OwnerOverTotal      = Owners          /OccupiedTotal) %>% 
  mutate(MortAndOwnOverTotal = MortAndOwn      /OccupiedTotal) %>% 
  mutate(CostFirst           = RentersOverTotal*RentCost + MortgagorsOverTotal*MortgagorCost + OwnerOverTotal*OwnerCost) %>% 
  mutate(CostSecond          = RentersOverTotal*RentCost + MortAndOwnOverTotal*MedianMortAndOwnCost) %>% 
  mutate(FirstTotal          = RentersOverTotal          + MortgagorsOverTotal +               OwnerOverTotal) %>% 
  mutate(SecondTotal         = RentersOverTotal          + MortAndOwnOverTotal) %>% 
  pivot_wider(id_cols = c("GEOID", "NAME", "NAMELSAD"),
              names_from = year,
              values_from = c("RentCost", "MortgagorCost", "OwnerCost",
                              "MedianMortAndOwnCost", "Renters", "Mortgagors",
                              "Owners", "MortAndOwn", "OccupiedTotal",
                              "RentersOverTotal", "MortgagorsOverTotal", "OwnerOverTotal",
                              "MortAndOwnOverTotal", "CostFirst", "CostSecond",
                              "MedianHousingCost", "FirstTotal", "SecondTotal")) %>% 
  mutate(PointChangeFirst    = CostFirst_2019            - CostFirst_2014) %>%
  mutate(PointChangeSecond   = CostSecond_2019           - CostSecond_2014)
head(costs3)

Bringing the un-recoded MOEs back into the dataframe

costs4 <- costs %>%
  select(year, GEOID, NAME, NAMELSAD, RentCostMOE, MortgagorCostMOE, OwnerCostMOE,
         MedianMortAndOwnMOE, RentersMOE, MortgagorsMOE, OwnersMOE, MortAndOwnMOE,
         OccupiedTotalMOE, MedianHousingCostMOE) %>%
  pivot_wider(id_cols = c("GEOID", "NAME", "NAMELSAD"),
              names_from = year,
              values_from = c("RentCostMOE", "MortgagorCostMOE", "OwnerCostMOE",
                              "MedianMortAndOwnMOE", "RentersMOE", "MortgagorsMOE",
                              "OwnersMOE", "MortAndOwnMOE", "OccupiedTotalMOE",
                              "MedianHousingCostMOE")) %>% 
  full_join(., costs3, by = c("GEOID", "NAME", "NAMELSAD"))

cut2 <- costs4$GEOID
head(costs4)
SHP <- map_dfr(c("WA", "OR", "NV", "CA", "ID", "AZ", "UT",
                 "CO", "NM", "TX", "OK", "KS", "NE", "SD",
                 "ND", "MN", "IA", "MO", "AR", "LA", "WI",
                 "IL", "KY", "TN", "MS", "FL", "AL", "GA",
                 "SC", "NC", "VA", "WV", "OH", "MI", "NY",
                 "PA", "VT", "NH", "ME", "MA", "RI", "CT",
                 "NJ", "DE", "MD", "DC", "IN"
                 ), ~{
                   counties(.x, cb = TRUE, year = 2014)})
Using FIPS code '53' for state 'WA'
Using FIPS code '41' for state 'OR'
Using FIPS code '32' for state 'NV'
Using FIPS code '06' for state 'CA'
Using FIPS code '16' for state 'ID'
Using FIPS code '04' for state 'AZ'
Using FIPS code '49' for state 'UT'
Using FIPS code '08' for state 'CO'
Using FIPS code '35' for state 'NM'
Using FIPS code '48' for state 'TX'
Using FIPS code '40' for state 'OK'
Using FIPS code '20' for state 'KS'
Using FIPS code '31' for state 'NE'
Using FIPS code '46' for state 'SD'
Using FIPS code '38' for state 'ND'
Using FIPS code '27' for state 'MN'
Using FIPS code '19' for state 'IA'
Using FIPS code '29' for state 'MO'
Using FIPS code '05' for state 'AR'
Using FIPS code '22' for state 'LA'
Using FIPS code '55' for state 'WI'
Using FIPS code '17' for state 'IL'
Using FIPS code '21' for state 'KY'
Using FIPS code '47' for state 'TN'
Using FIPS code '28' for state 'MS'
Using FIPS code '12' for state 'FL'
Using FIPS code '01' for state 'AL'
Using FIPS code '13' for state 'GA'
Using FIPS code '45' for state 'SC'
Using FIPS code '37' for state 'NC'
Using FIPS code '51' for state 'VA'
Using FIPS code '54' for state 'WV'
Using FIPS code '39' for state 'OH'
Using FIPS code '26' for state 'MI'
Using FIPS code '36' for state 'NY'
Using FIPS code '42' for state 'PA'
Using FIPS code '50' for state 'VT'
Using FIPS code '33' for state 'NH'
Using FIPS code '23' for state 'ME'
Using FIPS code '25' for state 'MA'
Using FIPS code '44' for state 'RI'
Using FIPS code '09' for state 'CT'
Using FIPS code '34' for state 'NJ'
Using FIPS code '10' for state 'DE'
Using FIPS code '24' for state 'MD'
Using FIPS code '11' for state 'DC'
Using FIPS code '18' for state 'IN'
SHP2 <- filter(SHP, GEOID %in% cut2)

SHP3 <- geo_join(SHP2, costs4, by = c("GEOID"))

SHP4 <- SHP3 %>% mutate(group = case_when(TRUE ~ NAMELSAD))

SHP5 <- group_by(SHP4, group) %>% 
    summarize(do_union = TRUE)
`summarise()` ungrouping output (override with `.groups` argument)st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
st_as_s2(): dropping Z and/or M coordinate
CostsMap <- ggplot() +
  geom_sf(data = SHP4, aes(fill = PointChangeFirst), color = NA) +
  labs(title = "percentage point change in costs over income through the 2010s",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-6.00,6.00), high = "purple", low = "yellow",
                    breaks = c(-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
CostsMap_2014 <- ggplot() +
  geom_sf(data = SHP4, aes(fill = CostFirst_2014), color = NA) +
  labs(title = "costs over income 2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(0,40), high = "purple", low = "yellow",
                    breaks = c(12, 18, 24, 30, 36)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
CostsMap_2019 <- ggplot() +
  geom_sf(data = SHP4, aes(fill = CostFirst_2019), color = NA) +
  labs(title = "costs over income 2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(0,40), high = "purple", low = "yellow",
                    breaks = c(12, 18, 24, 30, 36)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
CostsMap_2014

CostsMap_2019

CostsMap

Aggrigating to the LCSA by weighting resident cohorts’ cost contribution to the LCSA by their county cohorts in the numerator and the total of LCSA occupied units in the demoninator

costs5 <- costs4 %>% mutate(group = case_when(TRUE ~ NAMELSAD))

costs6 <- group_by(costs5, group) %>%
  mutate(CSAoccupiedTotal_2014       = sum(OccupiedTotal_2014),
         do_union = TRUE) %>%
  mutate(CSAoccupiedTotal_2019       = sum(OccupiedTotal_2019),
         do_union = TRUE) %>% 
  mutate(CSArenters_2014             = sum(Renters_2014),
         do_union = TRUE) %>% 
  mutate(CSArenters_2019             = sum(Renters_2019),
         do_union = TRUE) %>%
  mutate(CSAmortgagors_2014          = sum(Mortgagors_2014),
         do_union = TRUE) %>% 
  mutate(CSAmortgagors_2019          = sum(Mortgagors_2019),
         do_union = TRUE) %>%
  mutate(CSAowners_2014              = sum(Owners_2014),
         do_union = TRUE) %>% 
  mutate(CSAowners_2019              = sum(Owners_2019),
         do_union = TRUE) %>%
  mutate(CSAmortANDown_2014          = sum(MortAndOwn_2014),
         do_union = TRUE) %>% 
  mutate(CSAmortANDown_2019          = sum(MortAndOwn_2019),
         do_union = TRUE) %>% 
  mutate(CSArentersOverTotal_2014    = Renters_2014   /CSAoccupiedTotal_2014) %>% 
  mutate(CSArentersOverTotal_2019    = Renters_2019   /CSAoccupiedTotal_2019) %>%
  mutate(CSAmortgagorsOverTotal_2014 = Mortgagors_2014/CSAoccupiedTotal_2014) %>% 
  mutate(CSAmortgagorsOverTotal_2019 = Mortgagors_2019/CSAoccupiedTotal_2019) %>%
  mutate(CSAownersOverTotal_2014     = Owners_2014    /CSAoccupiedTotal_2014) %>% 
  mutate(CSAownersOverTotal_2019     = Owners_2019    /CSAoccupiedTotal_2019) %>%
  mutate(CSAmortANDownOverTotal_2014 = MortAndOwn_2014/CSAoccupiedTotal_2014) %>% 
  mutate(CSAmortANDownOverTotal_2019 = MortAndOwn_2019/CSAoccupiedTotal_2019) %>%
  mutate(CSAcostFirst_2014           =
           sum(CSArentersOverTotal_2014*RentCost_2014         +
               CSAmortgagorsOverTotal_2014*MortgagorCost_2014 +
               CSAownersOverTotal_2014*OwnerCost_2014),
         do_union = TRUE) %>% 
  mutate(CSAcostFirst_2019           =
           sum(CSArentersOverTotal_2019*RentCost_2019         +
               CSAmortgagorsOverTotal_2019*MortgagorCost_2019 +
               CSAownersOverTotal_2019*OwnerCost_2019),
         do_union = TRUE) %>%
  mutate(CSAcostSecond_2014          =
           sum(CSArentersOverTotal_2014*RentCost_2014         +
               CSAmortANDownOverTotal_2014*MedianMortAndOwnCost_2014),
         do_union = TRUE) %>% 
  mutate(CSAcostSecond_2019          =
           sum(CSArentersOverTotal_2019*RentCost_2019         +
               CSAmortANDownOverTotal_2019*MedianMortAndOwnCost_2019),
         do_union = TRUE) %>% 
  mutate(tot_test                    =
           sum(CSArentersOverTotal_2014                       +
               CSAmortANDownOverTotal_2014),
         do_union = TRUE) %>% 
  mutate(CSApointChangeFirst         = CSAcostFirst_2019  - CSAcostFirst_2014) %>% 
  mutate(CSApointChangeSecond        = CSAcostSecond_2019 - CSAcostSecond_2014)
head(costs6)
costs7 <- costs6 %>%
  select(group, CSApointChangeFirst, CSAcostFirst_2019, CSAcostFirst_2014) %>%
  distinct(., group, .keep_all = TRUE)

SHP6 <- geo_join(SHP5, costs7, by = c("group"))

CSA_SHP <- ggplot(data = SHP6, aes(fill = CSApointChangeFirst)) +
  labs(title = "percentage point change in costs over income through the 2010s",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSA_SHP_2014 <- ggplot(data = SHP6, aes(fill = CSAcostFirst_2014)) +
  labs(title = "LCSA costs over income 2014",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSA_SHP_2019 <- ggplot(data = SHP6, aes(fill = CSAcostFirst_2019)) +
  labs(title = "LCSA costs over income 2019",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSA_SHP_2014

CSA_SHP_2019

CSA_SHP

Searching for any missing values for starters homes

starters <- read_csv("permits.csv")
Missing column names filled in: 'X1' [1]
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
cols(
  X1 = col_double(),
  year = col_double(),
  GEOID = col_character(),
  COUNTY = col_character(),
  STATE = col_character(),
  StarterHomePermits = col_double()
)
head_start <- starters %>%
  pivot_wider(id_cols = c("GEOID", "COUNTY"),
              names_from = year,
              values_from = c("StarterHomePermits")) %>%
  filter(GEOID %in% cut2) %>% 
  select(GEOID, COUNTY, p10 = "2010", p11 = "2011", p12 = "2012", p13 = "2013",
         p14 = "2014", p15 = "2015", p16 = "2016", p17 = "2017", p18 = "2018",
         p19 = "2019")
Values are not uniquely identified; output will contain list-cols.
* Use `values_fn = list` to suppress this warning.
* Use `values_fn = length` to identify where the duplicates arise
* Use `values_fn = {summary_fun}` to summarise duplicates
head_start$p10 <- as.numeric(as.character(head_start$p10))
NAs introduced by coercion
head_start$p11 <- as.numeric(as.character(head_start$p11))
NAs introduced by coercion
head_start$p12 <- as.numeric(as.character(head_start$p12))
NAs introduced by coercion
head_start$p13 <- as.numeric(as.character(head_start$p13))
NAs introduced by coercion
head_start$p14 <- as.numeric(as.character(head_start$p14))
NAs introduced by coercion
head_start$p15 <- as.numeric(as.character(head_start$p15))
NAs introduced by coercion
head_start$p16 <- as.numeric(as.character(head_start$p16))
head_start$p17 <- as.numeric(as.character(head_start$p17))
head_start$p18 <- as.numeric(as.character(head_start$p18))
NAs introduced by coercion
head_start$p19 <- as.numeric(as.character(head_start$p19))
NAs introduced by coercion
head_start2 <- full_join(costs6, head_start, by = "GEOID") %>%
  filter(is.na(p10) | is.na(p11) | is.na(p12) | is.na(p13) |
         is.na(p14) | is.na(p15) | is.na(p16) | is.na(p17) |
         is.na(p18) | is.na(p19)) %>%
  select(GEOID, NAME, NAMELSAD, p10, p11, p12, p13, p14, p15,
         p16, p17, p18, p19)
Adding missing grouping variables: `group`
head(head_start2, 22)

Using 2019’s total units for all ten years makes sense here because we’re building toward the prensent day’s total

housing_units8 <- housing_units7 %>%
  mutate(p10 = case_when(is.na(p10) ~ Units_2019*weight10,
                   !is.na(p10) ~ p10)) %>% 
  mutate(p10 = round(p10*1, 0)) %>% 
  mutate(p11 = case_when(is.na(p11) ~ Units_2019*weight11,
                   !is.na(p11) ~ p11)) %>% 
  mutate(p11 = round(p11*1, 0)) %>% 
  mutate(p12 = case_when(is.na(p12) ~ Units_2019*weight12,
                   !is.na(p12) ~ p12)) %>% 
  mutate(p12 = round(p12*1, 0)) %>% 
  mutate(p13 = case_when(is.na(p13) ~ Units_2019*weight13,
                   !is.na(p13) ~ p13)) %>% 
  mutate(p13 = round(p13*1, 0)) %>% 
  mutate(p14 = case_when(is.na(p14) ~ Units_2019*weight14,
                   !is.na(p14) ~ p14)) %>% 
  mutate(p14 = round(p14*1, 0)) %>% 
  mutate(p15 = case_when(is.na(p15) ~ Units_2019*weight15,
                   !is.na(p15) ~ p15)) %>% 
  mutate(p15 = round(p15*1, 0)) %>% 
  mutate(p16 = case_when(is.na(p16) ~ Units_2019*weight16,
                   !is.na(p16) ~ p16)) %>% 
  mutate(p16 = round(p16*1, 0)) %>% 
  mutate(p17 = case_when(is.na(p17) ~ Units_2019*weight17,
                   !is.na(p17) ~ p17)) %>% 
  mutate(p17 = round(p17*1, 0)) %>% 
  mutate(p18 = case_when(is.na(p18) ~ Units_2019*weight18,
                   !is.na(p18) ~ p18)) %>% 
  mutate(p18 = round(p18*1, 0)) %>% 
  mutate(p19 = case_when(is.na(p19) ~ Units_2019*weight19,
                   !is.na(p19) ~ p19)) %>% 
  mutate(p19 = round(p19*1, 0))

There’s no need to clap, but you can if you want to

head(housing_units8, 22)

Let’s put those counties back into the main dataframe

housing_units9 <- full_join(housing_units8, housing_units5,
                    by = c("GEOID", "NAME", "Units_2014", "Units_2019", "p10",
                           "p11", "p12", "p13", "p14", "p15", "p16", "p17", "p18",
                           "p19", "UnitsMOE_2014", "UnitsMOE_2019")) %>% 
  mutate(NewStarters_2014      = p10+p11+p12+p13+p14) %>% 
  mutate(NewStarters_2019      = p15+p16+p17+p18+p19) %>% 
  mutate(StarterOverTotPP_2014 = 100*(NewStarters_2014/Units_2014)) %>% 
  mutate(StarterOverTotPP_2019 = 100*(NewStarters_2019/Units_2019)) %>% 
  mutate(StarterRatioPPchange  = StarterOverTotPP_2019-StarterOverTotPP_2014) %>% 
  mutate(StarterRatioDecade    = 100*(NewStarters_2014+NewStarters_2019)/Units_2019)

housing_units10 <- housing_units9 %>%
  select("GEOID", "NAME", "Units_2014", "Units_2019","UnitsMOE_2014", "UnitsMOE_2019",
         "NewStarters_2014", "NewStarters_2019", "StarterOverTotPP_2014", "StarterOverTotPP_2019",
         "StarterRatioPPchange", "StarterRatioDecade")

costs8 <- full_join(housing_units10, costs6, by = c("GEOID", "NAME"))
SHP7 <- SHP2 %>% select(GEOID, NAME, geometry)

SHP8 <- geo_join(SHP7, costs8, by = c("GEOID"))

lets_get_started <- ggplot() +
  geom_sf(data = SHP8, aes(fill = StarterRatioPPchange), color = NA) +
  labs(title = "percentage point change in new single-family unit permits over total units",
       subtitle = " 2010s, LCSA counties",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-13,13), high = "purple", low = "yellow",
                    breaks = c(-10, -8, -6, -4, -2, 0, 2, 4, 6, 8, 10)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
lets_get_started_2014 <- ggplot() +
  geom_sf(data = SHP8, aes(fill = StarterOverTotPP_2014), color = NA) +
  labs(title = "single-family unit permits over total units",
       subtitle = " 2014, LCSA counties",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-10,26), high = "purple", low = "yellow",
                    breaks = c(0, 2, 4, 6, 8, 10, 12, 18)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
lets_get_started_2019 <- ggplot() +
  geom_sf(data = SHP8, aes(fill = StarterOverTotPP_2019), color = NA) +
  labs(title = "single-family unit permits over total units",
       subtitle = " 2019, LCSA counties",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-10,26), high = "purple", low = "yellow",
                    breaks = c(0, 2, 4, 6, 8, 10, 12, 18)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
lets_get_started_2014

lets_get_started_2019

lets_get_started

SHP7 <- SHP2 %>% select(GEOID, NAME, geometry)

SHP8 <- geo_join(SHP7, costs8, by = c("GEOID"))

lets_get_started1 <- ggplot() +
  geom_sf(data = SHP8, aes(fill = StarterRatioDecade), color = NA) +
  labs(title = "percentage of total units from new single-family unit permits",
       subtitle = " 2010s, LCSA counties",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-13,13), high = "purple", low = "yellow",
                    breaks = c(0, 2, 4, 6, 8, 10)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
lets_get_started1

costs8 <- group_by(costs8, group) %>%
  mutate(CSAunitsTotal_2019 = sum(Units_2019),
         do_union = TRUE) %>% 
  mutate(CSAunitsTotal_2014 = sum(Units_2014),
         do_union = TRUE) %>% 
  mutate(CSAunitsOverTotalUnits_2014 = Units_2014/CSAunitsTotal_2014) %>% 
  mutate(CSAunitsOverTotalUnits_2019 = Units_2019/CSAunitsTotal_2019) %>%
  mutate(CSAstarterRatioPPchange     = sum(CSAunitsOverTotalUnits_2019*StarterRatioPPchange),
         do_union = TRUE) %>% 
  mutate(CSAstarterRatioDecade       = sum(CSAunitsOverTotalUnits_2019*StarterRatioDecade),
         do_union = TRUE) %>% 
  mutate(CSAstarterOverTotPP_2014    = sum(CSAunitsOverTotalUnits_2014*StarterOverTotPP_2014),
         do_union = TRUE) %>% 
  mutate(CSAstarterOverTotPP_2019 = sum(CSAunitsOverTotalUnits_2019*StarterOverTotPP_2019),
         do_union = TRUE)

CSA_SHP2 <- geo_join(SHP5, costs8, by = c("group"))

lets_get_started2 <- ggplot(data = CSA_SHP2, aes(fill = CSAstarterRatioPPchange)) +
     labs(title = "LCSA percentage point change in new single-family unit permits over total units",
          subtitle = " 2010s",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
    theme(legend.title=element_blank()) +
    theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
lets_get_started_2014_2 <- ggplot(data = CSA_SHP2, aes(fill = CSAstarterOverTotPP_2014)) +
     labs(title = "LCSA percentage of new single-family unit permits over total units",
          subtitle = " 2014",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 2) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
    theme(legend.title=element_blank()) +
    theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
lets_get_started_2019_2 <- ggplot(data = CSA_SHP2, aes(fill = CSAstarterOverTotPP_2019)) +
     labs(title = "LCSA percentage of new single-family unit permits over total units",
          subtitle = " 2019",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 2) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
    theme(legend.title=element_blank()) +
    theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
lets_get_started_2014_2

lets_get_started_2019_2

lets_get_started2

lets_get_started22 <- ggplot(data = CSA_SHP2, aes(fill = CSAstarterRatioDecade)) +
     labs(title = "LCSA percentage of total units from new single-family unit permits",
          subtitle = " 2010s",
       caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
    theme(legend.title=element_blank()) +
    theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
lets_get_started22

Domestic migration among counties within a LCSA as well as net migration for LCSAs

flow_2014 <- read_csv("flow_2014.csv")
Missing column names filled in: 'X1' [1]
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
cols(
  X1 = col_double(),
  GEOID1 = col_character(),
  GEOID2 = col_character(),
  FULL1_NAME = col_character(),
  FULL2_NAME = col_character(),
  variable = col_character(),
  estimate = col_double(),
  moe = col_double()
)
flow_2019 <- read_csv("flow_2019.csv")
Missing column names filled in: 'X1' [1]
── Column specification ─────────────────────────────────────────────────────────────────────────────────────────────
cols(
  X1 = col_double(),
  GEOID1 = col_character(),
  GEOID2 = col_character(),
  FULL1_NAME = col_character(),
  FULL2_NAME = col_character(),
  variable = col_character(),
  estimate = col_double(),
  moe = col_double()
)
flow_2014_2 <- flow_2014 %>%
  pivot_wider(., id_cols = c("GEOID1", "GEOID2",
                             "FULL1_NAME", "FULL2_NAME"
                             ),
              names_from = variable,
              values_from = c("estimate", "moe")) %>% 
  select(-"estimate_MOVEDIN", -"estimate_MOVEDOUT", -"moe_MOVEDIN",
         -"moe_MOVEDOUT")

flow_2019_2 <- flow_2019 %>%
  pivot_wider(., id_cols = c("GEOID1", "GEOID2",
                             "FULL1_NAME", "FULL2_NAME"
                             ),
              names_from = variable,
              values_from = c("estimate", "moe")) %>% 
  select(-"estimate_MOVEDIN", -"estimate_MOVEDOUT", -"moe_MOVEDIN",
         -"moe_MOVEDOUT")

##Let’s try to get foreign migration as well

flow_2014_for <- flow_2014 %>%
  pivot_wider(., id_cols = c("GEOID1", "GEOID2",
                             "FULL1_NAME", "FULL2_NAME"
                             ),
              names_from = variable,
              values_from = c("estimate", "moe")) %>% 
  select(-"estimate_MOVEDNET", -"estimate_MOVEDOUT", -"moe_MOVEDNET",
         -"moe_MOVEDOUT")

flow_2014_for <- flow_2014_for %>% filter(is.na(GEOID2))
#----
flow_2014_for <- filter(flow_2014_for, GEOID1 %in% cut2) %>%
  select(GEOID = GEOID1, GEOID2, FULL1_NAME, FULL2_NAME, IN_14 = estimate_MOVEDIN, INmoe_14 = moe_MOVEDIN)


flow_2014_for <- full_join(flow_2014_for, costs3, by = c("GEOID")) %>% 
  select(GEOID, NAME = FULL1_NAME, NAMELSAD, region = FULL2_NAME, IN_14, INmoe_14)
#unique(flow_2014_for$region)

flow_2014_for <- flow_2014_for %>% mutate(group = case_when(TRUE ~ GEOID))

#----

flow_2019_for <- flow_2019 %>%
  pivot_wider(., id_cols = c("GEOID1", "GEOID2",
                             "FULL1_NAME", "FULL2_NAME"
                             ),
              names_from = variable,
              values_from = c("estimate", "moe")) %>% 
  select(-"estimate_MOVEDNET", -"estimate_MOVEDOUT", -"moe_MOVEDNET",
         -"moe_MOVEDOUT")

flow_2019_for <- flow_2019_for %>% filter(is.na(GEOID2))
#----
flow_2019_for <- filter(flow_2019_for, GEOID1 %in% cut2) %>%
  select(GEOID = GEOID1, GEOID2, FULL1_NAME, FULL2_NAME, IN_19 = estimate_MOVEDIN, INmoe_19 = moe_MOVEDIN)


flow_2019_for <- full_join(flow_2019_for, costs3, by = c("GEOID")) %>% 
  select(GEOID, NAME = FULL1_NAME, NAMELSAD, region = FULL2_NAME, IN_19, INmoe_19)
#unique(flow_2019_for$region)

flow_2019_for <- flow_2019_for %>% mutate(group = case_when(TRUE ~ GEOID))

theBIGfor <- merge(flow_2014_for, flow_2019_for,
                    by=c("GEOID" = "GEOID", "NAME" = "NAME",
                         "NAMELSAD" = "NAMELSAD",
                         "region" = "region",
                         "group" = "group"),
                    all = TRUE)
#unique(theBIGfor$region)

#----
theBIGfor2 <- theBIGfor %>% select(-NAME, -region, -group)

index <- is.na(theBIGfor2)
theBIGfor2[index] <- 0

theBIGfor2 <- theBIGfor2 %>% mutate(INcounty14_19 = IN_14 + IN_19)

theBIGfor2 <- theBIGfor2 %>% mutate(group = case_when(TRUE ~ GEOID))

theBIGfor3 <- group_by(theBIGfor2, group) %>% 
  summarise(INcountyTot14_19 = sum(INcounty14_19), do_union = TRUE) %>%
  select(GEOID = group, INcountyTot14_19)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGfor33 <- group_by(theBIGfor2, group) %>%
  summarise(INcountyTot14    = sum(IN_14), do_union = TRUE) %>% 
  select(GEOID = group, INcountyTot14)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGfor333 <- group_by(theBIGfor2, group) %>%
  summarise(INcountyTot19    = sum(IN_19), do_union = TRUE) %>% 
  select(GEOID = group, INcountyTot19)
`summarise()` ungrouping output (override with `.groups` argument)
head(flow_2014_2)
flow_2014_US <- flow_2014_2 %>%
  remove_missing(name = "estimate_MOVEDNET") 
Removed 9705 rows containing missing values (estimate_MOVEDNET).
#just net migration, which means only domestic
CSAcountiesTo <- filter(flow_2014_US, GEOID1 %in% cut2)
head(CSAcountiesTo, 50)
CSAcountiesToandFrom2 <- filter(CSAcountiesTo, GEOID2 %in% cut2) %>%
  select(GEOID = GEOID1, GEOID2, FULL1_NAME, FULL2_NAME, NET = estimate_MOVEDNET, NETmoe = moe_MOVEDNET)
#only net migration from other LCSA counties
big_test <- full_join(CSAcountiesToandFrom2, costs3, by = c("GEOID")) %>% 
  select(GEOID1 = GEOID, GEOID = GEOID2, FULL1_NAME, NAMELSAD_FULL1_NAME = NAMELSAD, FULL2_NAME, NET, NETmoe)

big_test2 <- full_join(big_test, costs3, by = c("GEOID")) %>% 
  select(GEOID1, GEOID2 = GEOID, FULL1_NAME, NAMELSAD_FULL1_NAME, FULL2_NAME, NAMELSAD_FULL2_NAME = NAMELSAD, NET, NETmoe)

big_test3 <- big_test2 %>% filter(NAMELSAD_FULL1_NAME == NAMELSAD_FULL2_NAME)
#only net migration from other counties within the same LCSA
big_test4 <- big_test3 %>% mutate(group = case_when(TRUE ~ GEOID1))
head(big_test4, 50)
CSAcountiesToandFrom3 <- CSAcountiesTo %>%
  select(GEOID = GEOID1, GEOID2, FULL1_NAME, FULL2_NAME, NET = estimate_MOVEDNET, NETmoe = moe_MOVEDNET)

big_test5 <- full_join(CSAcountiesToandFrom3, costs3, by = c("GEOID")) %>% 
  select(GEOID1 = GEOID, GEOID = GEOID2, FULL1_NAME, NAMELSAD_FULL1_NAME = NAMELSAD, FULL2_NAME, NET, NETmoe)

big_test6 <- full_join(big_test5, costs3, by = c("GEOID")) %>% 
  select(GEOID1, GEOID2 = GEOID, FULL1_NAME, NAMELSAD_FULL1_NAME, FULL2_NAME, NAMELSAD_FULL2_NAME = NAMELSAD, NET, NETmoe)

big_test7 <- big_test6 %>% filter(NAMELSAD_FULL1_NAME != NAMELSAD_FULL2_NAME | is.na(NAMELSAD_FULL2_NAME))
#domestic migration from counties NOT within the same LCSA
head(big_test7, 50)
flow_2019_US <- flow_2019_2 %>% remove_missing(name = "estimate_MOVEDNET")
Removed 9880 rows containing missing values (estimate_MOVEDNET).
CSAcountiesTo2 <- filter(flow_2019_US, GEOID1 %in% cut2)

CSAcountiesToandFrom4 <- filter(CSAcountiesTo2, GEOID2 %in% cut2) %>%
  select(GEOID = GEOID1, GEOID2, FULL1_NAME, FULL2_NAME, NET = estimate_MOVEDNET, NETmoe = moe_MOVEDNET)

big_test9 <- full_join(CSAcountiesToandFrom4, costs3, by = c("GEOID")) %>% 
  select(GEOID1 = GEOID, GEOID = GEOID2, FULL1_NAME, NAMELSAD_FULL1_NAME = NAMELSAD, FULL2_NAME, NET, NETmoe)

big_test10 <- full_join(big_test9, costs3, by = c("GEOID")) %>% 
  select(GEOID1, GEOID2 = GEOID, FULL1_NAME, NAMELSAD_FULL1_NAME, FULL2_NAME, NAMELSAD_FULL2_NAME = NAMELSAD, NET, NETmoe)

big_test11 <- big_test10 %>%
  filter(NAMELSAD_FULL1_NAME == NAMELSAD_FULL2_NAME)

CSAcountiesToandFrom5 <- CSAcountiesTo2 %>%
  select(GEOID = GEOID1, GEOID2, FULL1_NAME, FULL2_NAME, NET = estimate_MOVEDNET, NETmoe = moe_MOVEDNET)

big_test13 <- full_join(CSAcountiesToandFrom5, costs3, by = c("GEOID")) %>% 
  select(GEOID1 = GEOID, GEOID = GEOID2, FULL1_NAME, NAMELSAD_FULL1_NAME = NAMELSAD, FULL2_NAME, NET, NETmoe)

big_test14 <- full_join(big_test13, costs3, by = c("GEOID")) %>%
  select(GEOID1, GEOID2 = GEOID, FULL1_NAME, NAMELSAD_FULL1_NAME, FULL2_NAME, NAMELSAD_FULL2_NAME = NAMELSAD, NET, NETmoe)

big_test15 <- big_test14 %>% filter(NAMELSAD_FULL1_NAME != NAMELSAD_FULL2_NAME | is.na(NAMELSAD_FULL2_NAME))

big_test14_INternal <- big_test4 %>% select(GEOID1, FULL1_NAME, NAMELSAD_FULL1_NAME, GEOID2, FULL2_NAME,
                                            NAMELSAD_FULL2_NAME, inNET_14 = NET, inNETmoe_14 = NETmoe)

big_test14_EXternal <- big_test7 %>% select(GEOID1, FULL1_NAME, NAMELSAD_FULL1_NAME, GEOID2, FULL2_NAME,
                                            NAMELSAD_FULL2_NAME, exNET_14 = NET, exNETmoe_14 = NETmoe)

big_test19_INternal <- big_test11 %>% select(GEOID1, FULL1_NAME, NAMELSAD_FULL1_NAME, GEOID2, FULL2_NAME,
                                             NAMELSAD_FULL2_NAME, inNET_19 = NET, inNETmoe_19 = NETmoe)

big_test19_EXternal <- big_test15 %>% select(GEOID1, FULL1_NAME, NAMELSAD_FULL1_NAME, GEOID2, FULL2_NAME,
                                             NAMELSAD_FULL2_NAME, exNET_19 = NET, exNETmoe_19 = NETmoe)

theBIGinny2 <- merge(big_test14_INternal, big_test19_INternal,
                     by=c("GEOID1" = "GEOID1", "FULL1_NAME" = "FULL1_NAME",
                          "NAMELSAD_FULL1_NAME" = "NAMELSAD_FULL1_NAME",
                          "GEOID2" = "GEOID2", "FULL2_NAME" = "FULL2_NAME",
                          "NAMELSAD_FULL2_NAME" = "NAMELSAD_FULL2_NAME"),
                     all = TRUE)

index <- is.na(theBIGinny2)

theBIGinny2[index] <- 0

theBIGinny2 <- theBIGinny2 %>%
  mutate(inNETcounty14_19 = inNET_14 + inNET_19)

theBIGinny2 <- theBIGinny2 %>%
  mutate(group = case_when(TRUE ~ GEOID1))

theBIGinny3 <- group_by(theBIGinny2, group) %>%
  summarise(inNETcountyTot14_19 = sum(inNETcounty14_19), do_union = TRUE) %>%
  select(GEOID = group, inNETcountyTot14_19)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGinny33 <- group_by(theBIGinny2, group) %>%
  summarise(inNETcountyTot14    = sum(inNET_14), do_union = TRUE) %>% 
  select(GEOID = group, inNETcountyTot14)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGinny333 <- group_by(theBIGinny2, group) %>%
  summarise(inNETcountyTot19    = sum(inNET_19), do_union = TRUE) %>% 
  select(GEOID = group, inNETcountyTot19)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGouty <- merge(big_test14_EXternal, big_test19_EXternal,
                    by=c("GEOID1" = "GEOID1", "FULL1_NAME" = "FULL1_NAME",
                         "NAMELSAD_FULL1_NAME" = "NAMELSAD_FULL1_NAME",
                         "GEOID2" = "GEOID2", "FULL2_NAME" = "FULL2_NAME",
                         "NAMELSAD_FULL2_NAME" = "NAMELSAD_FULL2_NAME"),
                    all = TRUE)

index <- is.na(theBIGouty)
theBIGouty[index] <- 0

theBIGouty <- theBIGouty %>% mutate(exNETcounty14_19 = exNET_14 + exNET_19)

theBIGouty <- theBIGouty %>% mutate(group = case_when(TRUE ~ GEOID1))

theBIGouty2 <- group_by(theBIGouty, group) %>% 
  summarise(exNETcountyTot14_19 = sum(exNETcounty14_19), do_union = TRUE) %>%
  select(GEOID = group, exNETcountyTot14_19)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGouty22 <- group_by(theBIGouty, group) %>%
  summarise(exNETcountyTot14    = sum(exNET_14), do_union = TRUE) %>% 
  select(GEOID = group, exNETcountyTot14)
`summarise()` ungrouping output (override with `.groups` argument)
theBIGouty222 <- group_by(theBIGouty, group) %>%
  summarise(exNETcountyTot19    = sum(exNET_19), do_union = TRUE) %>% 
  select(GEOID = group, exNETcountyTot19)
`summarise()` ungrouping output (override with `.groups` argument)
LCSA_13 <- full_join(costs8, theBIGinny3, by = c("GEOID"))

LCSA_133 <- full_join(LCSA_13, theBIGinny33, by = c("GEOID"))

LCSA_1333 <- full_join(LCSA_133, theBIGinny333, by = c("GEOID"))

LCSA_14 <- full_join(LCSA_1333, theBIGouty2, by = c("GEOID"))

LCSA_144 <- full_join(LCSA_14, theBIGouty22, by = c("GEOID"))

LCSA_1444 <- full_join(LCSA_144, theBIGouty222, by = c("GEOID"))

LCSA_14444 <- full_join(LCSA_1444, theBIGfor3, by = c("GEOID"))

LCSA_144444 <- full_join(LCSA_14444, theBIGfor33, by = c("GEOID"))

LCSA_1444444 <- full_join(LCSA_144444, theBIGfor333, by = c("GEOID"))

LCSA_15 <- group_by(LCSA_1444444, group) %>%
  mutate(CSAexternalMigrationNET = sum(exNETcountyTot14_19), do_union = TRUE) %>% 
  mutate(CSAexMigrationNET_14 = sum(exNETcountyTot14), do_union = TRUE) %>% 
  mutate(CSAexMigrationNET_19 = sum(exNETcountyTot19), do_union = TRUE)
head(LCSA_15, 50)

How to conceive of population relative to domestic migration wherein there is a one to one relationship is very subjective, I see people wrestle with this when they offer quantitative figures on the matter. I think of population in this context as an amorphous whole. Something that expands and contracts but is fundimentally = to 1. Also worth noting is that the migration figures are five year estimates. So considering those estimates relative to other estimates from a five year span lends to the whole “amorphous whole” paradigm.

head(LCSA_17, 50)
countiesSHP6 <- SHP2 %>% select(GEOID, geometry)

countiesSHP8 <- geo_join(countiesSHP6, LCSA_17, by = c("GEOID"))
colnames(countiesSHP8)
Change3 <- ggplot() +
   geom_sf(data = countiesSHP8, aes(fill = pointcontributionFromInternal), color = NA) +
   labs(title = "percentage point contribution to county population",
        subtitle = " 2010s net domestic migration from counties within LCSA",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-13,13), high = "purple", low = "yellow",
                    breaks = c(-10, -6, -2, 0, 2, 6, 10)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_2014 <- ggplot() +
   geom_sf(data = countiesSHP8, aes(fill = pointFromInternal_2014), color = NA) +
   labs(title = "point contribution to 2014 county population",
        subtitle = " Net domestic migration from counties within LCSA",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-8,8), high = "purple", low = "yellow",
                    breaks = c(-6, -4, -2, 0, 2, 6)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_2019 <- ggplot() +
   geom_sf(data = countiesSHP8, aes(fill = pointFromInternal_2019), color = NA) +
   labs(title = "point contribution to 2019 county population",
        subtitle = " Net domestic migration from counties within LCSA",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-8,8), high = "purple", low = "yellow",
                    breaks = c(-6, -4, -2, 0, 2, 6)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_14_19 <- ggplot() +
   geom_sf(data = countiesSHP8, aes(fill = pointChangeInternal), color = NA) +
   labs(title = "point change from 2014 to 2019 county population",
        subtitle = " Net domestic migration from counties within LCSA",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  theme_void() +
  scale_fill_binned(limits = c(-2,2), high = "purple", low = "yellow",
                    breaks = c(-1, 0, 1)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_2014

ChangePoint_2019

ChangePoint_14_19

Change3

Change4 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointcontributionFromExternal), color = NA) +
  labs(title = "percentage point contribution to county population",
       subtitle = " 2010s external net migration from counties outside of shared LCSA",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,25), high = "purple", low = "yellow",
                    breaks = c(-20, -10, 0, 10, 20)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_ex2014 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointFromExternal_2014), color = NA) +
  labs(title = "point contribution to 2014 county population",
        subtitle = " LCSA external net migration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-15,15), high = "purple", low = "yellow",
                    breaks = c(-10, -5, 0, 5, 10, 15)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_ex2019 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointFromExternal_2019), color = NA) +
  labs(title = "point contribution to 2019 county population",
        subtitle = " LCSA external net migration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-15,15), high = "purple", low = "yellow",
                    breaks = c(-10, -5, 0, 5, 10, 15)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_ex_14_19 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointChangeExternal), color = NA) +
  labs(title = "point change from 2014 to 2019 county population",
        subtitle = " LCSA external net migration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-1.5,1.5), high = "purple", low = "yellow",
                    breaks = c(-1.25, -1, -.75, -.5, -.25, 0, .25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_ex2014

ChangePoint_ex2019

ChangePoint_ex_14_19

Change4

LCSA_17 <- LCSA_17 %>% 
  mutate(CSAstarterRatioDecade       = sum(CSAunitsOverTotalUnits_2019*StarterRatioDecade),
         do_union = TRUE)

CSAshp3 <- geo_join(SHP5, LCSA_17, by = c("group"))

CSAchange3 <- ggplot(data = CSAshp3, aes(fill = CSApointcontributionFromExternal)) +
     labs(title = "percentage point contribution to population",
          subtitle = " 2010s net migration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSAchange14 <- ggplot(data = CSAshp3, aes(fill = CSApointcontributionFromExternal_14)) +
     labs(title = "point contribution to 2014 LCSA population",
          subtitle = " LCSA net migration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSAchange19 <- ggplot(data = CSAshp3, aes(fill = CSApointcontributionFromExternal_19)) +
     labs(title = "point contribution to 2019 LCSA population",
          subtitle = " LCSA net migration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSApointChange <- ggplot(data = CSAshp3, aes(fill = CSApointChangeExternal)) +
     labs(title = "point change in LCSA migration",
          subtitle = " LCSA net migration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSAchange14

CSAchange19

CSApointChange

CSAchange3

Foreign migration

forChange4 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointcontributionFromForeign), color = NA) +
  labs(title = "percentage point contribution to county population",
       subtitle = " 2010s foreign immigration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-5,7), high = "purple", low = "yellow",
                    breaks = c(0, .25, 1, 2, 4, 6)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_for2014 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointFromForeign_2014), color = NA) +
  labs(title = "point contribution to 2014 county population",
        subtitle = " foreign immigration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-4,4), high = "purple", low = "yellow",
                    breaks = c(0, .3, .6, 1.2, 1.8, 2.4, 3)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_for2019 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointFromForeign_2019), color = NA) +
  labs(title = "point contribution to 2019 county population",
        subtitle = " foreign immigration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-4,4), high = "purple", low = "yellow",
                    breaks = c(0, .3, .6, 1.2, 1.8, 2.4, 3)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_for_14_19 <- ggplot() +
  geom_sf(data = countiesSHP8, aes(fill = pointChangeForeign), color = NA) +
  labs(title = "point change from 2014 to 2019 county population",
        subtitle = " foreign immigration",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-3,5), high = "purple", low = "yellow",
                    breaks = c(-2, -.5, .75, 1.5, 4)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
ChangePoint_for2014

ChangePoint_for2019

ChangePoint_for_14_19

forChange4

CSAchange3for <- ggplot(data = CSAshp3, aes(fill = CSApointcontributionFromForeign)) +
     labs(title = "percentage point contribution to population",
          subtitle = " 2010s foreign immigration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 1) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSAchange14for <- ggplot(data = CSAshp3, aes(fill = CSApointcontributionFromForeign_14)) +
     labs(title = "point contribution to 2014 LCSA population",
          subtitle = " LCSA foreign immigration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = .5) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSAchange19for <- ggplot(data = CSAshp3, aes(fill = CSApointcontributionFromForeign_19)) +
     labs(title = "point contribution to 2019 LCSA population",
          subtitle = " LCSA foreign immigration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = .5) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSApointChangefor <- ggplot(data = CSAshp3, aes(fill = CSApointChangeForeign)) +
     labs(title = "point change in LCSA migration",
          subtitle = " LCSA foreign immigration",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
CSAchange14for

CSAchange19for

CSApointChangefor

CSAchange3for

Breaking down the research so far…

Lancaster_Omaha_example <- countiesSHP8 %>% filter(str_detect(NAMELSAD, "Lincoln-Beatrice, NE CSA") |
                                            str_detect(NAMELSAD, "Omaha-Council Bluffs-Fremont, NE-IA CSA"))

Lancaster_Omaha_LCSA_example3 <- CSAshp3 %>% filter(str_detect(NAMELSAD, "Lincoln-Beatrice, NE CSA") |
                                              str_detect(NAMELSAD, "Omaha-Council Bluffs-Fremont, NE-IA CSA"))

LancasterLCSA_table <- LCSA_17 %>% filter(str_detect(NAMELSAD, "Lincoln-Beatrice, NE CSA") |
                                          str_detect(NAMELSAD, "Omaha-Council Bluffs-Fremont, NE-IA CSA"))
exam <- ggplot(data = Lancaster_Omaha_example, aes(fill = PointChangeFirst)) +
     labs(title = 'PointChangeFirst',
          subtitle = "percentage point change in housing cost over income",
          caption = "CostFirst_2019-CostFirst_2014") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam

exam2 <- ggplot(data = Lancaster_Omaha_example, aes(fill = CostFirst_2019)) +
     labs(title = 'CostFirst_2019',
          subtitle = "sum((household_type(s)/all_occupied_units)*household_type_cost(s))",
          caption = "renter, mortgagor and owner weights sum to 1") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 30) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam2

exam3 <- ggplot(data = Lancaster_Omaha_LCSA_example3, aes(fill = CSApointChangeFirst)) +
  labs(title = 'CSApointChangeFirst',
          subtitle = "percentage point change in housing cost over income",
          caption = "CSAcostFirst_2019-CSAcostFirst_2014") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam3

exam4 <- ggplot(data = Lancaster_Omaha_LCSA_example3, aes(fill = CSAcostFirst_2019)) +
  labs(title = 'CSAcostFirst_2019',
       subtitle = "sum((counties_type(s)/LCSAs_units)*counties_type_cost(s))",
       caption = "counites' LCSA-occupied-units-normalized resident(s) weights sum to 1") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 30) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam4

exam5 <- ggplot(data = Lancaster_Omaha_example, aes(fill = StarterRatioPPchange)) +
     labs(title = 'StarterRatioPPchange',
          subtitle = "point change in new single-family unit permits over total 2019 units",
          caption = "(sum(singles_15_19)/Total_19)-(sum(singles_10_14)/Total_19)") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam5

exam55 <- ggplot(data = Lancaster_Omaha_example, aes(fill = StarterRatioDecade)) +
     labs(title = 'StarterRatioDecade',
          subtitle = "percentage of total units from new single-family unit permits",
          caption = "100*(NewStarters_2014+NewStarters_2019)/Units_2019)") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam55

exam6 <- ggplot(data = Lancaster_Omaha_LCSA_example3, aes(fill = CSAstarterRatioPPchange)) +
  labs(title = 'CSAstarterRatioPPchange',
       subtitle = "sum((countyUnits/CSAunits)*StarterRatioPPchange)",
       caption = "counites' LCSA-units-normalized point-change weights sum to 1") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam6

exam66 <- ggplot(data = Lancaster_Omaha_LCSA_example3, aes(fill = CSAstarterRatioDecade)) +
  labs(title = 'CSAstarterRatioDecade',
       subtitle = "sum(CSAunitsOverTotalUnits_2019*StarterRatioDecade), by LCSA",
       caption = "LCSA-units-normalized ratio decade weights sum to 1") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam66

exam7 <- ggplot(data = Lancaster_Omaha_example, aes(fill = pointcontributionFromInternal)) +
     labs(title = 'pointcontributionFromInternal',
          subtitle = "point contribution to 2019 county pop from NET INternal LCSA migration",
          caption = "((sum(intraLCSAnetIM14)+sum(intraLCSAnetIM19))/countyPop19)*100") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam7

exam8 <- ggplot(data = Lancaster_Omaha_example, aes(fill = pointcontributionFromExternal)) +
     labs(title = 'pointcontributionFromExternal',
          subtitle = "point contribution to 2019 county pop from NET EXternal LCSA migration",
          caption = "((sum(exterLCSAnetIM14)+sum(exterLCSAnetIM19))/countyPop19)*100") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam8

exam9 <- ggplot(data = Lancaster_Omaha_LCSA_example3, aes(fill = CSApointcontributionFromExternal)) +
  labs(title = 'CSApointcontributionFromExternal',
       subtitle = "sum((LCSAexterCountyNET19+LCSAexterCountyNET14)), by LCSA",
       caption = "dataframe merged arrivals and departures to preserve NET domestic migrant flows") +
  geom_sf(color = "lightyellow") +
  geom_sf(data = Lancaster_Omaha_LCSA_example3, fill = NA, color = "red") +
  theme_void() +
  scale_fill_steps2(n.breaks = 3, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.975, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = NA))
exam9

##Bringing in the geodemographics

demoControl <- read_csv("demoControl.csv")
Missing column names filled in: 'X1' [1]
── Column specification ───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
cols(
  X1 = col_double(),
  year = col_double(),
  GEOID = col_character(),
  NAME = col_character(),
  variable = col_character(),
  estimate = col_double(),
  moe = col_double()
)
demoControl2 <- demoControl %>%
  pivot_wider(., id_cols = c("year", "GEOID"),
              names_from = variable,
              values_from = c("estimate", "moe"))

demoControl3 <- demoControl2 %>%
  mutate(hisp_prime_male = estimate_B01001I_009 + estimate_B01001I_010 + estimate_B01001I_011 + estimate_B01001I_012) %>% 
  mutate(prime_male = estimate_B01001_011 + estimate_B01001_012 + estimate_B01001_013 + estimate_B01001_014 + estimate_B01001_015 + estimate_B01001_016) %>% 
  mutate(hispMale25_54overMale25_54 = (hisp_prime_male/prime_male)*100) %>% 
  mutate(postUNDERgrad_female_22_29 = estimate_B01001_034 + estimate_B01001_035) %>% 
  mutate(fertileFEmale_15_49 = estimate_B01001_030 + estimate_B01001_031 + estimate_B01001_032 + estimate_B01001_033 + estimate_B01001_034 + estimate_B01001_035 +
         estimate_B01001_036 + estimate_B01001_037 + estimate_B01001_038 + estimate_B01001_039) %>% 
  mutate(female22_29overFemale15_49 = (postUNDERgrad_female_22_29/fertileFEmale_15_49)*100) %>% 
  mutate(whiteMALES_45_54 = estimate_B01001A_012) %>% 
  mutate(MALES_45_54 = estimate_B01001_015 + estimate_B01001_016) %>%
  mutate(whiteMALE45_54overMALE45_54 = (whiteMALES_45_54/MALES_45_54)*100) %>%
  mutate(black0_17 = estimate_B01001B_003 + estimate_B01001B_004 + estimate_B01001B_005 + estimate_B01001B_006 + estimate_B01001B_018 +
         estimate_B01001B_019 + estimate_B01001B_020 + estimate_B01001B_021) %>% 
  mutate(asian0_17 = estimate_B01001D_003 + estimate_B01001D_004 + estimate_B01001D_005 + estimate_B01001D_006 + estimate_B01001D_018 +
         estimate_B01001D_019 + estimate_B01001D_020 + estimate_B01001D_021) %>% 
  mutate(youth0_17 = estimate_B01001_003 + estimate_B01001_004 + estimate_B01001_005 + estimate_B01001_006 + estimate_B01001_027 +
         estimate_B01001_028 + estimate_B01001_029 + estimate_B01001_030) %>% 
  mutate(black0_17over0_17 = (black0_17/youth0_17)*100) %>% 
  mutate(asian0_17over0_17 = (asian0_17/youth0_17)*100) %>% 
  mutate(pop65plusOVERpop = ((estimate_B01001_020 + estimate_B01001_021 + estimate_B01001_022 + estimate_B01001_023 + estimate_B01001_024 +
                              estimate_B01001_025 + estimate_B01001_044 + estimate_B01001_045 + estimate_B01001_046 + estimate_B01001_047 +
                              estimate_B01001_048 + estimate_B01001_049)/ estimate_B01001_001)*100) %>% 
  mutate(OCCUPIEDrooms = estimate_B25014_001) %>% 
  mutate(roomsWITHoneORless = estimate_B25014_003 + estimate_B25014_004 + estimate_B25014_009 + estimate_B25014_010) %>% 
  mutate(roomsWITHmoreTHANone = estimate_B25014_005 + estimate_B25014_006 + estimate_B25014_007 +
         estimate_B25014_011 + estimate_B25014_012 + estimate_B25014_013)

demoControl4 <- demoControl3 %>% 
  select(year, GEOID, hispMale25_54overMale25_54, female22_29overFemale15_49, whiteMALE45_54overMALE45_54, black0_17over0_17,
         asian0_17over0_17, pop65plusOVERpop, OCCUPIEDrooms, roomsWITHmoreTHANone, prime_male, fertileFEmale_15_49, MALES_45_54,
         youth0_17, pop = estimate_B01001_001) %>% 
    pivot_wider(., id_cols = c("GEOID"),
              names_from = year,
              values_from = c("hispMale25_54overMale25_54", "female22_29overFemale15_49", "whiteMALE45_54overMALE45_54",
                              "black0_17over0_17", "asian0_17over0_17", "pop65plusOVERpop",
                              "OCCUPIEDrooms", "roomsWITHmoreTHANone", "prime_male", "fertileFEmale_15_49",
                              "MALES_45_54", "pop", "youth0_17")) %>% 
  mutate(pointCHANGEhispPRIMEmale = hispMale25_54overMale25_54_2019 - hispMale25_54overMale25_54_2014) %>% 
  mutate(pointCHANGEpostGRADfertPREV = female22_29overFemale15_49_2019 - female22_29overFemale15_49_2014) %>% 
  mutate(pointCHANGEpeakWHTmaleEARNERSprev = whiteMALE45_54overMALE45_54_2019 - whiteMALE45_54overMALE45_54_2014) %>% 
  mutate(pointCHANGEblackYOUTHprev = black0_17over0_17_2019 - black0_17over0_17_2014) %>% 
  mutate(pointCHANGEasianYOUTHprev = asian0_17over0_17_2019 - asian0_17over0_17_2014) %>% 
  mutate(pointCHANGEretireePREV = pop65plusOVERpop_2019 - pop65plusOVERpop_2014) %>% 
  mutate(OCCroomsMOREthanONEocc_19 = (roomsWITHmoreTHANone_2019/OCCUPIEDrooms_2019)*100) %>% 
  mutate(OCCroomsMOREthanONEocc_14 = (roomsWITHmoreTHANone_2014/OCCUPIEDrooms_2014)*100) %>% 
  mutate(pointCHNGoccRMmoreTHANone = OCCroomsMOREthanONEocc_19 - OCCroomsMOREthanONEocc_14)

##Joining dataframes

density <- SHP2 %>%
  st_set_geometry(., NULL) %>%
  select(-STATEFP, -COUNTYFP, -COUNTYNS, -AFFGEOID, -NAME, -LSAD, -AWATER)

popDEN <- poppy %>% select(GEOID, TotalPop_2014, TotalPop_2019)
  
density2 <- density %>% full_join(., popDEN, by = c("GEOID"))

density2 <- density2 %>% 
  mutate(density_2014 = TotalPop_2014/ALAND) %>% 
  mutate(density_2019 = TotalPop_2019/ALAND) %>% 
  mutate(densityPointChange = density_2019 - density_2014) %>% 
  select(-TotalPop_2014, -TotalPop_2019)

LCSA_17 <- LCSA_17 %>% full_join(., density2, by = c("GEOID")) %>% 
  mutate(csaALAND = sum(ALAND),
         do_union = TRUE)

LCSA_17 <- LCSA_17 %>% 
  mutate(csaDENSITY_2014 = CSApopTotal_2014/csaALAND) %>% 
  mutate(csaDENSITY_2019 = CSApopTotal_2019/csaALAND)

LCSA_17 <- LCSA_17 %>% 
  mutate(pointCHANGEcsaDENSITY = csaDENSITY_2019 - csaDENSITY_2014)

LCSA_18 <- LCSA_17 %>% full_join(., demoControl4, by = c("GEOID"))

LCSA_18 <- LCSA_18 %>%
  select(GEOID, NAME,
         CostFirst_2014, PointChangeFirst, CostFirst_2019,
         StarterOverTotPP_2014, StarterRatioPPchange, StarterOverTotPP_2019, StarterRatioDecade,
         pointFromInternal_2014, pointChangeInternal,pointFromInternal_2019, pointcontributionFromInternal,
         pointFromExternal_2014, pointChangeExternal, pointFromExternal_2019, pointcontributionFromExternal,
         pointFromForeign_2014, pointChangeForeign, pointFromForeign_2019, pointcontributionFromForeign,
         hispMale25_54overMale25_54_2014, pointCHANGEhispPRIMEmale, hispMale25_54overMale25_54_2019,
         female22_29overFemale15_49_2014, pointCHANGEpostGRADfertPREV, female22_29overFemale15_49_2019,
         whiteMALE45_54overMALE45_54_2014, pointCHANGEpeakWHTmaleEARNERSprev, whiteMALE45_54overMALE45_54_2019,
         black0_17over0_17_2014, pointCHANGEblackYOUTHprev, black0_17over0_17_2019,
         asian0_17over0_17_2014, pointCHANGEasianYOUTHprev, asian0_17over0_17_2019,
         pop65plusOVERpop_2014, pointCHANGEretireePREV, pop65plusOVERpop_2019,
         OCCroomsMOREthanONEocc_14, pointCHNGoccRMmoreTHANone, OCCroomsMOREthanONEocc_19,
         OCCUPIEDrooms_2014, OCCUPIEDrooms_2019,
         density_2014, densityPointChange, density_2019,
         prime_male_2014, prime_male_2019,
         fertileFEmale_15_49_2014, fertileFEmale_15_49_2019,
         MALES_45_54_2014, MALES_45_54_2019,
         pop_2014, pop_2019,
         youth0_17_2014, youth0_17_2019,
         NAMELSAD, group, do_union,
         CSAcostFirst_2014, CSApointChangeFirst, CSAcostFirst_2019,
         CSAstarterOverTotPP_2014, CSAstarterRatioPPchange, CSAstarterOverTotPP_2019, CSAstarterRatioDecade,
         CSApointcontributionFromExternal_14, CSApointChangeExternal, CSApointcontributionFromExternal_19, CSApointcontributionFromExternal,
         CSApointcontributionFromForeign_14, CSApointChangeForeign, CSApointcontributionFromForeign_19, CSApointcontributionFromForeign,
         csaDENSITY_2014, pointCHANGEcsaDENSITY, csaDENSITY_2019) %>% 
  mutate(csaPRIMEmale_14 = sum(prime_male_2014),
         do_union = TRUE) %>% 
  mutate(csaHISPmalePRIMEprev_14 = sum((prime_male_2014/csaPRIMEmale_14)*hispMale25_54overMale25_54_2014),
         do_union = TRUE) %>% 
  mutate(csaPRIMEmale_19 = sum(prime_male_2019),
         do_union = TRUE) %>% 
  mutate(csaHISPmalePRIMEprev_19 = sum((prime_male_2019/csaPRIMEmale_19)*hispMale25_54overMale25_54_2019),
         do_union = TRUE) %>% 
  mutate(csaPOINTchangeHISPprev = csaHISPmalePRIMEprev_19 - csaHISPmalePRIMEprev_14) %>% 
  mutate(csaFERTfemale_14 = sum(fertileFEmale_15_49_2014),
         do_union = TRUE) %>% 
  mutate(csaFERTfemalePREV_14 = sum((fertileFEmale_15_49_2014/csaFERTfemale_14)*female22_29overFemale15_49_2014),
         do_union = TRUE) %>% 
  mutate(csaFERTfemale_19 = sum(fertileFEmale_15_49_2019),
         do_union = TRUE) %>% 
  mutate(csaFERTfemalePREV_19 = sum((fertileFEmale_15_49_2019/csaFERTfemale_19)*female22_29overFemale15_49_2019),
         do_union = TRUE) %>% 
  mutate(csaPOINTchangeFERTfemale = csaFERTfemalePREV_19 - csaFERTfemalePREV_14) %>% 
  mutate(csaPEAKwhiteMALEearn_14 = sum(MALES_45_54_2014),
         do_union = TRUE) %>% 
  mutate(csaWHITEmaleEARN_14 = sum((MALES_45_54_2014/csaPEAKwhiteMALEearn_14)*whiteMALE45_54overMALE45_54_2014),
         do_union = TRUE) %>% 
  mutate(csaPEAKwhiteMALEearn_19 = sum(MALES_45_54_2019),
         do_union = TRUE) %>% 
  mutate(csaWHITEmaleEARN_19 = sum((MALES_45_54_2019/csaPEAKwhiteMALEearn_19)*whiteMALE45_54overMALE45_54_2019),
         do_union = TRUE) %>% 
  mutate(csaPOINTchangeWHITEmaleEARN = csaWHITEmaleEARN_19 - csaWHITEmaleEARN_14) %>% 
  mutate(csaPOP_14 = sum(pop_2014),
         do_union = TRUE) %>% 
  mutate(csa65plusPREV_14 = sum((pop_2014/csaPOP_14)*pop65plusOVERpop_2014),
         do_union = TRUE) %>% 
  mutate(csaPOP_19 = sum(pop_2019),
         do_union = TRUE) %>% 
  mutate(csa65plusPREV_19 = sum((pop_2019/csaPOP_19)*pop65plusOVERpop_2019),
         do_union = TRUE) %>% 
  mutate(csaPOINTchange65plusPREV = csa65plusPREV_19 - csa65plusPREV_14) %>% 
  mutate(csaYOUTH_14 = sum(youth0_17_2014),
         do_union = TRUE) %>% 
  mutate(csaBLACKyouthPREV_14 = sum((youth0_17_2014/csaYOUTH_14)*black0_17over0_17_2014),
         do_union = TRUE) %>% 
  mutate(csaYOUTH_19 = sum(youth0_17_2019),
         do_union = TRUE) %>% 
  mutate(csaBLACKyouthPREV_19 = sum((youth0_17_2019/csaYOUTH_19)*black0_17over0_17_2019),
         do_union = TRUE) %>% 
  mutate(csaPOINTchangeBLACKyouthPREV = csaBLACKyouthPREV_19 - csaBLACKyouthPREV_14) %>% 
  mutate(csaASIANyouthPREV_14 = sum((youth0_17_2014/csaYOUTH_14)*asian0_17over0_17_2014),
         do_union = TRUE) %>% 
  mutate(csaASIANyouthPREV_19 = sum((youth0_17_2019/csaYOUTH_19)*asian0_17over0_17_2019),
         do_union = TRUE) %>% 
  mutate(csaPOINTchangeASIANyouthPREV = csaASIANyouthPREV_19 - csaASIANyouthPREV_14) %>% 
  mutate(csaOCCrooms_14 = sum(OCCUPIEDrooms_2014),
         do_union = TRUE) %>% 
  mutate(csaOCCrooms_19 = sum(OCCUPIEDrooms_2019),
         do_union = TRUE) %>% 
  mutate(csaOCCrmMOREthanONE_14 = sum((OCCUPIEDrooms_2014/csaOCCrooms_14)*OCCroomsMOREthanONEocc_14),
         do_union = TRUE) %>% 
  mutate(csaOCCrmMOREthanONE_19 = sum((OCCUPIEDrooms_2019/csaOCCrooms_19)*OCCroomsMOREthanONEocc_19),
         do_union = TRUE) %>% 
  mutate(csaPOINTchangeOCCrmMOREthanONE = csaOCCrmMOREthanONE_19 - csaOCCrmMOREthanONE_14)

countiesSHP10 <- countiesSHP6 %>% full_join(., LCSA_18, by = c("GEOID"))

LCSA_SHP10 <- geo_join(SHP5, LCSA_18, by = c("group"))

##Making GEOJSONs

jsonnyCounites <- countiesSHP10 %>%
  select(GEOID, NAME,
         PointChangeFirst, CostFirst_2019,
         StarterRatioPPchange, StarterOverTotPP_2019, StarterRatioDecade,
         pointChangeInternal, pointFromInternal_2019, pointcontributionFromInternal,
         pointChangeExternal, pointFromExternal_2019, pointcontributionFromExternal,
         pointChangeForeign, pointFromForeign_2019, pointcontributionFromForeign,
         pointCHANGEhispPRIMEmale, hispMale25_54overMale25_54_2019,
         pointCHANGEpostGRADfertPREV, female22_29overFemale15_49_2019,
         pointCHANGEpeakWHTmaleEARNERSprev, whiteMALE45_54overMALE45_54_2019,
         pointCHANGEblackYOUTHprev, black0_17over0_17_2019,
         pointCHANGEasianYOUTHprev, asian0_17over0_17_2019,
         pointCHANGEretireePREV, pop65plusOVERpop_2019,
         pointCHNGoccRMmoreTHANone, OCCroomsMOREthanONEocc_19,
         density_2014, densityPointChange, density_2019,
         geometry) %>% 
  filter(GEOID %in% cut2) %>%
  mutate(PointChangeFirst = PointChangeFirst) %>% 
  mutate(CostFirst_2019 = CostFirst_2019) %>% 
  mutate(StarterRatioPPchange = StarterRatioPPchange) %>% 
  mutate(StarterOverTotPP_2019 = StarterOverTotPP_2019) %>% 
  mutate(StarterRatioDecade = StarterRatioDecade) %>% 
  mutate(pointChangeInternal = pointChangeInternal) %>% 
  mutate(pointFromInternal_2019 = pointFromInternal_2019) %>% 
  mutate(pointcontributionFromInternal = pointcontributionFromInternal) %>% 
  mutate(pointChangeExternal = pointChangeExternal) %>% 
  mutate(pointFromExternal_2019 = pointFromExternal_2019) %>% 
  mutate(pointcontributionFromExternal = pointcontributionFromExternal) %>%
  mutate(pointChangeForeign = pointChangeForeign) %>%
  mutate(pointFromForeign_2019 = pointFromForeign_2019) %>%
  mutate(pointcontributionFromForeign = pointcontributionFromForeign) %>%
  mutate(pointCHANGEhispPRIMEmale = pointCHANGEhispPRIMEmale) %>% 
  mutate(hispMale25_54overMale25_54_2019 = hispMale25_54overMale25_54_2019) %>% 
  mutate(pointCHANGEpostGRADfertPREV = pointCHANGEpostGRADfertPREV) %>% 
  mutate(female22_29overFemale15_49_2019 = female22_29overFemale15_49_2019) %>% 
  mutate(pointCHANGEpeakWHTmaleEARNERSprev = pointCHANGEpeakWHTmaleEARNERSprev) %>% 
  mutate(whiteMALE45_54overMALE45_54_2019 = whiteMALE45_54overMALE45_54_2019) %>% 
  mutate(pointCHANGEblackYOUTHprev = pointCHANGEblackYOUTHprev) %>% 
  mutate(black0_17over0_17_2019 = black0_17over0_17_2019) %>% 
  mutate(pointCHANGEasianYOUTHprev = pointCHANGEasianYOUTHprev) %>% 
  mutate(asian0_17over0_17_2019 = asian0_17over0_17_2019) %>% 
  mutate(pointCHANGEretireePREV = pointCHANGEretireePREV) %>% 
  mutate(pop65plusOVERpop_2019 = pop65plusOVERpop_2019) %>% 
  mutate(pointCHNGoccRMmoreTHANone = pointCHNGoccRMmoreTHANone) %>% 
  mutate(OCCroomsMOREthanONEocc_19 = OCCroomsMOREthanONEocc_19)

sf::st_write(jsonnyCounites, dsn = "/Users/cwoodson2/Desktop/Phoenix/jsonnyCounites.geojson",
             layer = "jsonnyCounites.geojson")
Writing layer `jsonnyCounites.geojson' to data source `/Users/cwoodson2/Desktop/Phoenix/jsonnyCounites.geojson' using driver `GeoJSON'
Writing 1234 features with 33 fields and geometry type 3D Multi Polygon.
jsonnyCounites2 <- jsonnyCounites %>%
  st_set_geometry(., NULL) %>%
  select(-GEOID, -NAME)

corry <- cor(jsonnyCounites2)

jsonnyLCSA <- LCSA_SHP10 %>% 
  select(group,
         CSApointChangeFirst, CSAcostFirst_2019,
         CSAstarterRatioPPchange, CSAstarterOverTotPP_2019, CSAstarterRatioDecade,
         CSApointChangeExternal, CSApointcontributionFromExternal_19, CSApointcontributionFromExternal,
         CSApointChangeForeign, CSApointcontributionFromForeign_19, CSApointcontributionFromForeign,
         csaPOINTchangeHISPprev, csaHISPmalePRIMEprev_19,
         csaPOINTchangeFERTfemale, csaFERTfemalePREV_19,
         csaPOINTchangeWHITEmaleEARN, csaWHITEmaleEARN_19,
         csaPOINTchange65plusPREV, csa65plusPREV_19,
         csaPOINTchangeBLACKyouthPREV, csaBLACKyouthPREV_19,
         csaPOINTchangeASIANyouthPREV, csaASIANyouthPREV_19,
         csaPOINTchangeOCCrmMOREthanONE, csaOCCrmMOREthanONE_19,
         csaDENSITY_2014, pointCHANGEcsaDENSITY, csaDENSITY_2019,) %>% 
  mutate(CSApointChangeFirst = CSApointChangeFirst) %>% 
  mutate(CSAcostFirst_2019 = CSAcostFirst_2019) %>% 
  mutate(CSAstarterRatioPPchange = CSAstarterRatioPPchange) %>% 
  mutate(CSAstarterOverTotPP_2019 = CSAstarterOverTotPP_2019) %>% 
  mutate(CSAstarterRatioDecade = CSAstarterRatioDecade) %>% 
  mutate(CSApointChangeExternal = CSApointChangeExternal) %>% 
  mutate(CSApointcontributionFromExternal_19 = CSApointcontributionFromExternal_19) %>% 
  mutate(CSApointcontributionFromExternal = CSApointcontributionFromExternal) %>%
  mutate(CSApointChangeForeign = CSApointChangeForeign) %>%
  mutate(CSApointcontributionFromForeign_19 = CSApointcontributionFromForeign_19) %>%
  mutate(CSApointcontributionFromForeign = CSApointcontributionFromForeign) %>%
  mutate(csaPOINTchangeHISPprev = csaPOINTchangeHISPprev) %>% 
  mutate(csaHISPmalePRIMEprev_19 = csaHISPmalePRIMEprev_19) %>% 
  mutate(csaPOINTchangeFERTfemale = csaPOINTchangeFERTfemale) %>% 
  mutate(csaFERTfemalePREV_19 = csaFERTfemalePREV_19) %>% 
  mutate(csaPOINTchangeWHITEmaleEARN = csaPOINTchangeWHITEmaleEARN) %>% 
  mutate(csaWHITEmaleEARN_19 = csaWHITEmaleEARN_19) %>% 
  mutate(csaPOINTchange65plusPREV = csaPOINTchange65plusPREV) %>% 
  mutate(csa65plusPREV_19 = csa65plusPREV_19) %>% 
  mutate(csaPOINTchangeBLACKyouthPREV = csaPOINTchangeBLACKyouthPREV) %>% 
  mutate(csaBLACKyouthPREV_19 = csaBLACKyouthPREV_19) %>% 
  mutate(csaPOINTchangeASIANyouthPREV = csaPOINTchangeASIANyouthPREV) %>% 
  mutate(csaASIANyouthPREV_19 = csaASIANyouthPREV_19) %>% 
  mutate(csaPOINTchangeOCCrmMOREthanONE = csaPOINTchangeOCCrmMOREthanONE) %>% 
  mutate(csaOCCrmMOREthanONE_19 = csaOCCrmMOREthanONE_19)

sf::st_write(jsonnyLCSA, dsn = "/Users/cwoodson2/Desktop/Phoenix/jsonnyLCSA.geojson",
             layer = "jsonnyLCSA.geojson")
Writing layer `jsonnyLCSA.geojson' to data source `/Users/cwoodson2/Desktop/Phoenix/jsonnyLCSA.geojson' using driver `GeoJSON'
Writing 164 features with 29 fields and geometry type Unknown (any).
jsonnyLCSA2 <- jsonnyLCSA %>%
  st_set_geometry(., NULL) %>%
  select(-group)

corry2 <- cor(jsonnyLCSA2)

##Mapping geodemographics

hispMale_2014 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = hispMale25_54overMale25_54_2014), color = NA) +
  labs(title = "hispMale25_54overMale25_54_2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-40,100), high = "purple", low = "yellow",
                    breaks = c(0, 5, 10, 20, 40, 80)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
hispMale_2019 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = hispMale25_54overMale25_54_2019), color = NA) +
  labs(title = "hispMale25_54overMale25_54_2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-40,100), high = "purple", low = "yellow",
                    breaks = c(0, 5, 10, 20, 40, 80)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
hispMale_change <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHANGEhispPRIMEmale), color = NA) +
  labs(title = "pointCHANGEhispPRIMEmale",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-15,20), high = "purple", low = "yellow",
                    breaks = c(-5, 0, 5, 10, 15)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csaHISPmalePRIMEprev_14 <- ggplot(data = LCSA_SHP10, aes(fill = csaHISPmalePRIMEprev_14)) +
     labs(title = "csaHISPmalePRIMEprev_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaPOINTchangeHISPprev <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchangeHISPprev)) +
     labs(title = "csaPOINTchangeHISPprev",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaHISPmalePRIMEprev_19 <- ggplot(data = LCSA_SHP10, aes(fill = csaHISPmalePRIMEprev_19)) +
     labs(title = "csaHISPmalePRIMEprev_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
hispMale_2014

hispMale_change

hispMale_2019

csaHISPmalePRIMEprev_14

csaPOINTchangeHISPprev

csaHISPmalePRIMEprev_19

female22_29_2014 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = female22_29overFemale15_49_2014), color = NA) +
  labs(title = "female22_29overFemale15_49_2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(0,30), high = "purple", low = "yellow",
                    breaks = c(5, 10, 15, 20, 25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
female22_29_2019 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = female22_29overFemale15_49_2019), color = NA) +
  labs(title = "female22_29overFemale15_49_2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(0,30), high = "purple", low = "yellow",
                    breaks = c(5, 10, 15, 20, 25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pointCHANGEpostGRADfert <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHANGEpostGRADfertPREV), color = NA) +
  labs(title = "pointCHANGEpostGRADfertPREV",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,25), high = "purple", low = "yellow",
                    breaks = c(-15, -10, -5, 0, 5, 10, 15)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csaFERTfemalePREV_14 <- ggplot(data = LCSA_SHP10, aes(fill = csaFERTfemalePREV_14)) +
     labs(title = "csaFERTfemalePREV_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaPOINTchangeFERTfemale <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchangeFERTfemale)) +
     labs(title = "csaPOINTchangeFERTfemale",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaFERTfemalePREV_19 <- ggplot(data = LCSA_SHP10, aes(fill = csaFERTfemalePREV_19)) +
     labs(title = "csaFERTfemalePREV_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
female22_29_2014

pointCHANGEpostGRADfert

female22_29_2019

csaFERTfemalePREV_14

csaPOINTchangeFERTfemale

csaFERTfemalePREV_19

whiteMALE45_54overMALE45_54_2014 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = whiteMALE45_54overMALE45_54_2014), color = NA) +
  labs(title = "whiteMALE45_54overMALE45_54_2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,100), high = "purple", low = "yellow",
                    breaks = c(5, 10, 20, 40, 80)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pointCHANGEpeakWHTmaleEARNERSprev <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHANGEpeakWHTmaleEARNERSprev), color = NA) +
  labs(title = "pointCHANGEpeakWHTmaleEARNERSprev",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,25), high = "purple", low = "yellow",
                    breaks = c(-15, -10, -5, 0, 5, 10, 15)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
whiteMALE45_54overMALE45_54_2019 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = whiteMALE45_54overMALE45_54_2019), color = NA) +
  labs(title = "whiteMALE45_54overMALE45_54_2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,100), high = "purple", low = "yellow",
                    breaks = c(5, 10, 20, 40, 80)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csaWHITEmaleEARN_14 <- ggplot(data = LCSA_SHP10, aes(fill = csaWHITEmaleEARN_14)) +
     labs(title = "csaWHITEmaleEARN_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 75) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaPOINTchangeWHITEmaleEARN <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchangeWHITEmaleEARN)) +
     labs(title = "csaPOINTchangeWHITEmaleEARN",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaWHITEmaleEARN_19 <- ggplot(data = LCSA_SHP10, aes(fill = csaWHITEmaleEARN_19)) +
     labs(title = "csaWHITEmaleEARN_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 75) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
whiteMALE45_54overMALE45_54_2014

pointCHANGEpeakWHTmaleEARNERSprev

whiteMALE45_54overMALE45_54_2019

csaWHITEmaleEARN_14

csaPOINTchangeWHITEmaleEARN

csaWHITEmaleEARN_19

black0_17over0_17_2014 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = black0_17over0_17_2014), color = NA) +
  labs(title = "black0_17over0_17_2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,100), high = "purple", low = "yellow",
                    breaks = c(5, 10, 20, 40, 80)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pointCHANGEblackYOUTHprev <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHANGEblackYOUTHprev), color = NA) +
  labs(title = "pointCHANGEblackYOUTHprev",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-12,20), high = "purple", low = "yellow",
                    breaks = c(-10, -5, 0, 5, 10, 15)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
black0_17over0_17_2019 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = black0_17over0_17_2019), color = NA) +
  labs(title = "black0_17over0_17_2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-25,100), high = "purple", low = "yellow",
                    breaks = c(5, 10, 20, 40, 80)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csaBLACKyouthPREV_14 <- ggplot(data = LCSA_SHP10, aes(fill = csaBLACKyouthPREV_14)) +
     labs(title = "csaBLACKyouthPREV_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaPOINTchangeBLACKyouthPREV <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchangeBLACKyouthPREV)) +
     labs(title = "csaPOINTchangeBLACKyouthPREV",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaBLACKyouthPREV_19 <- ggplot(data = LCSA_SHP10, aes(fill = csaBLACKyouthPREV_19)) +
     labs(title = "csaBLACKyouthPREV_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 25) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
black0_17over0_17_2014

pointCHANGEblackYOUTHprev

black0_17over0_17_2019

csaBLACKyouthPREV_14

csaPOINTchangeBLACKyouthPREV

csaBLACKyouthPREV_19

asian0_17over0_17_2014 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = asian0_17over0_17_2014), color = NA) +
  labs(title = "asian0_17over0_17_2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-15,40), high = "purple", low = "yellow",
                    breaks = c(0, 5, 10, 15, 20, 25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pointCHANGEasianYOUTHprev <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHANGEasianYOUTHprev), color = NA) +
  labs(title = "pointCHANGEasianYOUTHprev",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-9,11), high = "purple", low = "yellow",
                    breaks = c(-6, -2, 0, 2, 6)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
asian0_17over0_17_2019 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = asian0_17over0_17_2019), color = NA) +
  labs(title = "asian0_17over0_17_2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-15,40), high = "purple", low = "yellow",
                    breaks = c(0, 5, 10, 15, 20, 25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csaPOINTchangeASIANyouthPREV <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchangeASIANyouthPREV)) +
     labs(title = "csaPOINTchangeASIANyouthPREV",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaASIANyouthPREV_14 <- ggplot(data = LCSA_SHP10, aes(fill = csaASIANyouthPREV_14)) +
     labs(title = "csaASIANyouthPREV_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 5) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaASIANyouthPREV_19 <- ggplot(data = LCSA_SHP10, aes(fill = csaASIANyouthPREV_19)) +
     labs(title = "csaASIANyouthPREV_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 5) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
asian0_17over0_17_2014

pointCHANGEasianYOUTHprev

asian0_17over0_17_2019

csaASIANyouthPREV_14  

csaPOINTchangeASIANyouthPREV

csaASIANyouthPREV_19

pop65plusOVERpop_2014 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pop65plusOVERpop_2014), color = NA) +
  labs(title = "pop65plusOVERpop_2014",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-10,40), high = "purple", low = "yellow",
                    breaks = c(0, 5, 10, 15, 20, 25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pointCHANGEretireePREV <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHANGEretireePREV), color = NA) +
  labs(title = "pointCHANGEretireePREV",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-10,20), high = "purple", low = "yellow",
                    breaks = c(-2, 0, 2, 5, 10)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pop65plusOVERpop_2019 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pop65plusOVERpop_2019), color = NA) +
  labs(title = "pop65plusOVERpop_2019",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-10,40), high = "purple", low = "yellow",
                    breaks = c(0, 5, 10, 15, 20, 25)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csa65plusPREV_14 <- ggplot(data = LCSA_SHP10, aes(fill = csa65plusPREV_14)) +
     labs(title = "csa65plusPREV_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 15) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaPOINTchange65plusPREV <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchange65plusPREV)) +
     labs(title = "csaPOINTchange65plusPREV",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csa65plusPREV_19 <- ggplot(data = LCSA_SHP10, aes(fill = csa65plusPREV_19)) +
     labs(title = "csa65plusPREV_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 15) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
pop65plusOVERpop_2014

pointCHANGEretireePREV

pop65plusOVERpop_2019

csa65plusPREV_14

csaPOINTchange65plusPREV

csa65plusPREV_19

##occupants per room

OCCroomsMOREthanONEocc_14 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = OCCroomsMOREthanONEocc_14), color = NA) +
  labs(title = "OCCroomsMOREthanONEocc_14",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-5,15), high = "purple", low = "yellow",
                    breaks = c(0, 2, 4, 6, 8, 10, 12)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
pointCHNGoccRMmoreTHANone <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = pointCHNGoccRMmoreTHANone), color = NA) +
  labs(title = "pointCHNGoccRMmoreTHANone",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-7,15), high = "purple", low = "yellow",
                    breaks = c(-6, -4, -2, 0, 2, 4)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
OCCroomsMOREthanONEocc_19 <- ggplot() +
  geom_sf(data = countiesSHP10, aes(fill = OCCroomsMOREthanONEocc_19), color = NA) +
  labs(title = "OCCroomsMOREthanONEocc_19",
       caption = "U.S. Census Bureau") +
  geom_sf(data = SHP5, fill = NA, color = "darkgray") +
  geom_sf(color = NA) +
  theme_void() +
  scale_fill_binned(limits = c(-5,15), high = "purple", low = "yellow",
                    breaks = c(0, 2, 4, 6, 8, 10, 12)) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "darkgray"))
csaOCCrmMOREthanONE_14 <- ggplot(data = LCSA_SHP10, aes(fill = csaOCCrmMOREthanONE_14)) +
     labs(title = "csaOCCrmMOREthanONE_14",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 5) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaPOINTchangeOCCrmMOREthanONE <- ggplot(data = LCSA_SHP10, aes(fill = csaPOINTchangeOCCrmMOREthanONE)) +
     labs(title = "csaPOINTchangeOCCrmMOREthanONE",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 0) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
csaOCCrmMOREthanONE_19 <- ggplot(data = LCSA_SHP10, aes(fill = csaOCCrmMOREthanONE_19)) +
     labs(title = "csaOCCrmMOREthanONE_19",
          caption = "U.S. Census Bureau") +
  geom_sf(color = "lightyellow") +
  theme_void() +
  scale_fill_steps2(n.breaks = 5, low = "darkgreen", mid = "tan", high = "red", midpoint = 5) +
  theme(legend.justification = c(0, 1),
        legend.position = c(.85, .39)) +
  theme(legend.title=element_blank()) +
  theme(panel.background = element_rect(color = FALSE, fill = "lightyellow"))
OCCroomsMOREthanONEocc_14

pointCHNGoccRMmoreTHANone

OCCroomsMOREthanONEocc_19

csaOCCrmMOREthanONE_14

csaPOINTchangeOCCrmMOREthanONE

csaOCCrmMOREthanONE_19

k-means and regionalize

note for later: change scale on county migration maps

LS0tCnRpdGxlOiAiUmVzZWFyY2hfZGlhcnkiCmF1dGhvcjogImNvbGJ5X3dvb2Rzb24iCmRhdGU6ICIxLzIzLzIwMjMiCm91dHB1dDogaHRtbF9ub3RlYm9vawotLS0KCmBgYHtyfQpsaWJyYXJ5KGdncGxvdDIpCmxpYnJhcnkoc2YpCmxpYnJhcnkoZHBseXIpCmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHRpZHljZW5zdXMpCmxpYnJhcnkodGlncmlzKQpsaWJyYXJ5KHRpZHlyKQpvcHRpb25zKHRpZ3Jpc191c2VfY2FjaGUgPSBUUlVFKQpgYGAKCiMjIFdoYXQgaXMgYW4gIkxDU0EsIiB3aHkgZG9lcyBpdCBtYXR0ZXIgYW5kIGhvdyB3YXMgaXQgbWFkZT8gQSBjb21iaW5lZCBzdGF0aXN0aWNhbCBhcmVhIGlzIHR3byBhZGphY2VudCBtZXRyb3BvbGl0YW4gb3IgbWljcm9wb2xpdGFuIHN0YXRpc3RpY2FsIGFyZWFzIHRoYXQgaGF2ZSBhbiBlbXBsb3ltZW50IGludGVyY2hhbmdlIG1lYXN1cmUgKEVJTSkgb2YgYXQgbGVhc3QgMTUuIFRoaXMgcmVzZWFyY2ggY29pbnMgdGhlIHBocmFzZSAnbGFyZ2UgY29tYmluZWQgc3RhdGlzdGljYWwgYXJlYScgb3IgTENTQSwgZGVmaW5lZCBhcyBvbmx5IHRob3NlIENTQXMgdGhhdCBjb250YWluIGEgbWV0cm9wb2xpdGFuIGFyZWEuIFRoZSBMU0NBIGlzIHVzZWQgaGVyZSBhcyBhIHdheSB0byBuYXJyb3cgdGhlIHJlc2VhcmNoZXIncyBzY2FsZSB0byBhbiBhcmVhIHRoYXQgY29udGFpbnMgYSBwb3B1bGF0aW9uIHRoYXQgaXMgZW5nYWdlZCBpbiBkeW5hbWljIGludGVyLWNvdW50eSBhY3Rpdml0eSwgc3VjaCBhcyBjb25jaWV2YWJseSByZWxvY2F0aW5nIHRvIGJlIGNsb3NlciB0byB3b3JrIG9yIHRvIGJ1eSBhIGhvbWUgZm9yIGEgbmV3IGZhbWlseS4gSXQgaXMgdGhvdWdodCB0aGF0IHRoaXMgaXMgYW4gaW5zaWdodGZ1bCB3YXkgdG8gbGVhcm4gbW9yZSBhYm91dCBob3VzaW5nIGNvc3RzIG92ZXIgdGhlIDIwMTBzLiBIb3dldmVyLCBhcyB0aGUgYm91bmRhcmllcyBvZiBhIENTQSAnZmxvYXQnIGV2ZXJ5IHRocmVlIHRvIGZpdmUgeWVhcnMsIGN1c3RvbWl6ZWQgTENTQXMgdGhhdCBjb250YWluIGFsbCB0aGUgY291bnRpZXMgdGhhdCB3ZXJlIGV2ZXIgcGFydCBvZiBhbiBMQ1NBIGZyb20gMjAxMCB0aHJvdWdoIDIwMTkgd2VyZSBtYWRlIGFuZCBzdGF0aXN0aWNzIGRlcml2ZWQgZnJvbSBjb3VudHkgZXN0aW1hdGVzIHdlcmUgY2FsY3VsYXRlZC4KCmBgYHtyfQptYXBwaW5nX2V4YW1wbGUgPC0gbWFwX2RmcihjKCJBTCIsIkdBIiwiVE4iKSwKICAgICAgICAgICAgICAgICAgIH57Y291bnRpZXMoLngsIGNiID0gVFJVRSwgeWVhciA9IDIwMTApfSkKCm1hcHBpbmdfZXhhbXBsZV9DU0FfMDl0bzEzIDwtIGNvbWJpbmVkX3N0YXRpc3RpY2FsX2FyZWFzKGNiID0gRkFMU0UsIHllYXIgPSAyMDExKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FLCAiQUwiKSB8IHN0cl9kZXRlY3QoTkFNRSwgIkdBIikgfCBzdHJfZGV0ZWN0KE5BTUUsICJUTiIpKSAlPiUgCiAgZmlsdGVyKE5BTUVMU0FEID09ICJDaGF0dGFub29nYS1DbGV2ZWxhbmQtQXRoZW5zLCBUTi1HQSBDU0EiKQoKbWFwcGluZ19leGFtcGxlX211bmlfMDl0bzEzIDwtIGNvcmVfYmFzZWRfc3RhdGlzdGljYWxfYXJlYXMoeWVhciA9IDIwMTEpICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FLCAiQUwiKSB8IHN0cl9kZXRlY3QoTkFNRSwgIkdBIikgfCBzdHJfZGV0ZWN0KE5BTUUsICJUTiIpKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FTFNBRCwgIk1ldHJvIikpCgpleGFtcGxlXzA5dG8xMyA8LSBnZ3Bsb3QoKSArIAogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZSwgZmlsbCA9ICJsaWdodGdyYXkiLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZV9tdW5pXzA5dG8xMywgZmlsbCA9ICJncmVlbiIsIGNvbG9yID0gImdyZWVuIikgKwogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZV9DU0FfMDl0bzEzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkKYGBgCgojIyBFeGFtcGxlIGZyb20gMDkgdG8gMTMgcmVmIG1hcAoKYGBge3J9CmV4YW1wbGVfMDl0bzEzCmBgYAoKYGBge3J9Cm1hcHBpbmdfZXhhbXBsZV9DU0FfMTN0bzE4IDwtIGNvbWJpbmVkX3N0YXRpc3RpY2FsX2FyZWFzKGNiID0gRkFMU0UsIHllYXIgPSAyMDE1KSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FLCAiQUwiKSB8IHN0cl9kZXRlY3QoTkFNRSwgIkdBIikgfCBzdHJfZGV0ZWN0KE5BTUUsICJUTiIpKSAlPiUgCiAgZmlsdGVyKE5BTUVMU0FEID09ICJDaGF0dGFub29nYS1DbGV2ZWxhbmQtRGFsdG9uLCBUTi1HQS1BTCBDU0EiKQoKbWFwcGluZ19leGFtcGxlX211bmlfMTN0bzE4IDwtIGNvcmVfYmFzZWRfc3RhdGlzdGljYWxfYXJlYXMoeWVhciA9IDIwMTUpICU+JSAKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FLCAiQUwiKSB8IHN0cl9kZXRlY3QoTkFNRSwgIkdBIikgfCBzdHJfZGV0ZWN0KE5BTUUsICJUTiIpKSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FTFNBRCwgIk1ldHJvIikpCgpleGFtcGxlXzEzdG8xOCA8LSBnZ3Bsb3QoKSArIAogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZSwgZmlsbCA9ICJsaWdodGdyYXkiLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZV9tdW5pXzEzdG8xOCwgZmlsbCA9ICJncmVlbiIsIGNvbG9yID0gImdyZWVuIikgKwogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZV9DU0FfMTN0bzE4LCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkKYGBgCgojIyBFeGFtcGxlIGZyb20gMTMgdG8gMTggcmVmIG1hcAoKYGBge3J9CmV4YW1wbGVfMTN0bzE4CmBgYAoKYGBge3J9Cm1hcHBpbmdfZXhhbXBsZV9DU0FfMTh0bzIwIDwtIGNvbWJpbmVkX3N0YXRpc3RpY2FsX2FyZWFzKGNiID0gRkFMU0UsIHllYXIgPSAyMDE5KSAlPiUKICBmaWx0ZXIoc3RyX2RldGVjdChOQU1FLCAiQUwiKSB8IHN0cl9kZXRlY3QoTkFNRSwgIkdBIikgfCBzdHJfZGV0ZWN0KE5BTUUsICJUTiIpKSAlPiUgCiAgZmlsdGVyKE5BTUVMU0FEID09ICJDaGF0dGFub29nYS1DbGV2ZWxhbmQtRGFsdG9uLCBUTi1HQSBDU0EiIHwKICAgICAgICAgTkFNRUxTQUQgPT0gIlNjb3R0c2Jvcm8tRm9ydCBQYXluZSwgQUwgQ1NBIikKCm1hcHBpbmdfZXhhbXBsZV9tdW5pXzE4dG8yMCA8LSBjb3JlX2Jhc2VkX3N0YXRpc3RpY2FsX2FyZWFzKHllYXIgPSAyMDE5KSAlPiUgCiAgZmlsdGVyKHN0cl9kZXRlY3QoTkFNRSwgIkFMIikgfCBzdHJfZGV0ZWN0KE5BTUUsICJHQSIpIHwgc3RyX2RldGVjdChOQU1FLCAiVE4iKSkgJT4lCiAgZmlsdGVyKHN0cl9kZXRlY3QoTkFNRUxTQUQsICJNZXRybyIpKQoKZXhhbXBsZV8xOHRvMjAgPC0gZ2dwbG90KCkgKyAKICBnZW9tX3NmKGRhdGEgPSBtYXBwaW5nX2V4YW1wbGUsIGZpbGwgPSAibGlnaHRncmF5IiwgY29sb3IgPSAiZ3JheSIpICsKICBnZW9tX3NmKGRhdGEgPSBtYXBwaW5nX2V4YW1wbGVfbXVuaV8xOHRvMjAsIGZpbGwgPSAiZ3JlZW4iLCBjb2xvciA9ICJncmVlbiIpICsKICBnZW9tX3NmKGRhdGEgPSBtYXBwaW5nX2V4YW1wbGVfQ1NBXzE4dG8yMCwgZmlsbCA9IE5BLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfdm9pZCgpCmBgYAoKIyMgRXhhbXBsZSBmcm9tIDE4IHRvIDIwIHJlZiBtYXAKCmBgYHtyfQpleGFtcGxlXzE4dG8yMApgYGAKCmBgYHtyfQpjdXN0b21pemVkIDwtIHJlYWRfY3N2KCJMQ1NBX2N1dC5jc3YiKQoKY3V0IDwtIGN1c3RvbWl6ZWQkR0VPSUQKCm1hcHBpbmdfZXhhbXBsZV9wcmVfY3V0IDwtIG1hcHBpbmdfZXhhbXBsZSAlPiUgc2VsZWN0KEdFT0lEID0gR0VPX0lELCBnZW9tZXRyeSkKCm1hcHBpbmdfZXhhbXBsZV9jdXQgPC0gbWFwcGluZ19leGFtcGxlX3ByZV9jdXQgJT4lIHNlcGFyYXRlKEdFT0lELCBjKCJub3BlIiwgIkdFT0lEIiksICJVUyIpICU+JQogIHNlbGVjdCgtIm5vcGUiKQoKbWFwcGluZ19leGFtcGxlMiA8LSBmaWx0ZXIobWFwcGluZ19leGFtcGxlX2N1dCwgR0VPSUQgJWluJSBjdXQpCgptYXBwaW5nX2V4YW1wbGUzIDwtIGdlb19qb2luKG1hcHBpbmdfZXhhbXBsZTIsIGN1c3RvbWl6ZWQsIGJ5ID0gYygiR0VPSUQiKSkgJT4lIAogIGZpbHRlciguLCBHRU9JRCAlaW4lIGN1dCkKCm1hcHBpbmdfZXhhbXBsZTQgPC0gbWFwcGluZ19leGFtcGxlMyAlPiUgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFRSVUUgfiBOQU1FTFNBRCkpCgptYXBwaW5nX2V4YW1wbGU0IDwtIGdyb3VwX2J5KG1hcHBpbmdfZXhhbXBsZTQsIGdyb3VwKSAlPiUgCiAgICBzdW1tYXJpemUoZG9fdW5pb24gPSBUUlVFKSAlPiUgZmlsdGVyKCFpcy5uYSguKSkgJT4lIAogICAgZmlsdGVyKGdyb3VwID09ICJDaGF0dGFub29nYS1DbGV2ZWxhbmQtRGFsdG9uLCBUTi1HQS1BTCBDU0EiKQoKY3VzdG9taXplZF9leGFtcGxlMiA8LSBnZ3Bsb3QoKSArIAogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZSwgZmlsbCA9ICJsaWdodGdyYXkiLCBjb2xvciA9ICJncmF5IikgKwogIGdlb21fc2YoZGF0YSA9IG1hcHBpbmdfZXhhbXBsZTQsIGZpbGwgPSAicmVkIiwgY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKQpgYGAKCiMjIEN1c3RvbSAyMDEwcyBMQ1NBCgpgYGB7cn0KY3VzdG9taXplZF9leGFtcGxlMgpgYGAKCmBgYHtyfQpjb3N0cyA8LSBjdXN0b21pemVkICU+JQogIHBpdm90X3dpZGVyKC4sIGlkX2NvbHMgPSBjKCJ5ZWFyIiwgIkdFT0lEIiwgIk5BTUUiLCAiTkFNRUxTQUQiKSwKICAgICAgICAgICAgICBuYW1lc19mcm9tID0gdmFyaWFibGUsIHZhbHVlc19mcm9tID0gYygiZXN0aW1hdGUiLCAibW9lIikpICU+JQogIHNlbGVjdCh5ZWFyLCBHRU9JRCwgTkFNRSwgTkFNRUxTQUQsCiAgICAgICAgIFJlbnRDb3N0ID0gZXN0aW1hdGVfQjI1MDcxXzAwMSwgICAgICAgICAgICAgUmVudENvc3RNT0UgPSBtb2VfQjI1MDcxXzAwMSwKICAgICAgICAgTW9ydGdhZ29yQ29zdCA9IGVzdGltYXRlX0IyNTA5Ml8wMDIsICAgICAgICBNb3J0Z2Fnb3JDb3N0TU9FID0gbW9lX0IyNTA5Ml8wMDIsCiAgICAgICAgIE93bmVyQ29zdCA9IGVzdGltYXRlX0IyNTA5Ml8wMDMsICAgICAgICAgICAgT3duZXJDb3N0TU9FID0gbW9lX0IyNTA5Ml8wMDMsCiAgICAgICAgIE1lZGlhbk1vcnRBbmRPd25Db3N0ID0gZXN0aW1hdGVfQjI1MDkyXzAwMSwgTWVkaWFuTW9ydEFuZE93bk1PRSA9IG1vZV9CMjUwOTJfMDAxLAogICAgICAgICBSZW50ZXJzID0gZXN0aW1hdGVfQjI1MDAzXzAwMywgICAgICAgICAgICAgIFJlbnRlcnNNT0UgPSBtb2VfQjI1MDAzXzAwMywKICAgICAgICAgTW9ydGdhZ29ycyA9IGVzdGltYXRlX0IyNTA4MV8wMDIsICAgICAgICAgICBNb3J0Z2Fnb3JzTU9FID0gbW9lX0IyNTA4MV8wMDIsCiAgICAgICAgIE93bmVycyA9IGVzdGltYXRlX0IyNTA4MV8wMDgsICAgICAgICAgICAgICAgT3duZXJzTU9FID0gbW9lX0IyNTA4MV8wMDgsCiAgICAgICAgIE1vcnRBbmRPd24gPSBlc3RpbWF0ZV9CMjUwMDNfMDAyLCAgICAgICAgICAgTW9ydEFuZE93bk1PRSA9IG1vZV9CMjUwMDNfMDAyLAogICAgICAgICBPY2N1cGllZFRvdGFsID0gZXN0aW1hdGVfQjI1MDAzXzAwMSwgICAgICAgIE9jY3VwaWVkVG90YWxNT0UgPSBtb2VfQjI1MDAzXzAwMSwKICAgICAgICAgTWVkaWFuSG91c2luZ0Nvc3QgPSBlc3RpbWF0ZV9CMjUxMDVfMDAxLCAgICBNZWRpYW5Ib3VzaW5nQ29zdE1PRSA9IG1vZV9CMjUxMDVfMDAxKSAlPiUKICBmaWx0ZXIoIWlzLm5hKE5BTUVMU0FEKSkKCmNvc3RzMiA8LSBjb3N0cyAlPiUgc2VsZWN0KHllYXIsIEdFT0lELCBOQU1FLCBOQU1FTFNBRCwgUmVudENvc3QsIE1vcnRnYWdvckNvc3QsIE93bmVyQ29zdCwgTWVkaWFuTW9ydEFuZE93bkNvc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbnRlcnMsIE1vcnRnYWdvcnMsIE93bmVycywgTW9ydEFuZE93biwgT2NjdXBpZWRUb3RhbCwgTWVkaWFuSG91c2luZ0Nvc3QpCgpoZWFkIDwtIGNvc3RzMiAlPiUgZmlsdGVyKGlzLm5hKE1vcnRnYWdvckNvc3QpKQpgYGAKCiMjIFJlY29kaW5nIHplcm9zIGZvciBtb3J0Z2Fnb3IgY29zdHMgZHVlIHRvIHRoZSBjb3VudHkgZXNzZW50aWFsbHkgY29udGFpbmluZyBubyBtb3J0Z2Fnb3JzLCB0aGlzIHJlY29kaW5nIG9ubHkgcGVydGFpbnMgdG8gS2VuZWR5IENvdW50eQoKYGBge3J9CmhlYWQoaGVhZCkKYGBgCgpgYGB7cn0KaW5kZXggPC0gaXMubmEoY29zdHMyKQpjb3N0czJbaW5kZXhdIDwtIDAKaGVhZCA8LSBjb3N0czIgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KE5BTUUsICJLZW5lZHkgQ291bnR5LCBUZXhhcyIpKQpgYGAKCmBgYHtyfQpoZWFkKGhlYWQpCmBgYAoKIyMgIkNvc3RGaXJzdCIgd2VpZ2h0cyByZXNpZGVudCBjb2hvcnRzJyBjb3N0cyBieSB0aGVpciBwcmV2ZWxhbmNlOyBkaWZmZXJpZW50aWF0ZXMgYmV0d2VlbiByZW50ZXJzLCBtb3J0Z2Fnb3JzIGFuZCBvd25lcnMsIEknbSB2ZXJ5IHBhcnRpYWwgdG8gdGhpcyBtZXRob2Qgb3ZlciB0aGUgIkNvc3RTZWNvbmQiIG1ldGhvZCB0aGF0IHVzZXMgdGhlIHZhcmlhYmxlIHdpdGggdGhlIG1vcnRnYWdvcnMgYW5kIG93bmVycyBsdW1wZWQgdG9nZXRoZXIKCmBgYHtyfQpjb3N0czMgPC0gY29zdHMyICU+JQogIHNlbGVjdCh5ZWFyLCBHRU9JRCwgTkFNRSwgTkFNRUxTQUQsIFJlbnRDb3N0LCBNb3J0Z2Fnb3JDb3N0LCBPd25lckNvc3QsIE1lZGlhbk1vcnRBbmRPd25Db3N0LAogICAgICAgICBSZW50ZXJzLCBNb3J0Z2Fnb3JzLCBPd25lcnMsIE1vcnRBbmRPd24sIE9jY3VwaWVkVG90YWwsIE1lZGlhbkhvdXNpbmdDb3N0KSAlPiUKICBtdXRhdGUoUmVudGVyc092ZXJUb3RhbCAgICA9IFJlbnRlcnMgICAgICAgICAvT2NjdXBpZWRUb3RhbCkgJT4lIAogIG11dGF0ZShNb3J0Z2Fnb3JzT3ZlclRvdGFsID0gTW9ydGdhZ29ycyAgICAgIC9PY2N1cGllZFRvdGFsKSAlPiUgCiAgbXV0YXRlKE93bmVyT3ZlclRvdGFsICAgICAgPSBPd25lcnMgICAgICAgICAgL09jY3VwaWVkVG90YWwpICU+JSAKICBtdXRhdGUoTW9ydEFuZE93bk92ZXJUb3RhbCA9IE1vcnRBbmRPd24gICAgICAvT2NjdXBpZWRUb3RhbCkgJT4lIAogIG11dGF0ZShDb3N0Rmlyc3QgICAgICAgICAgID0gUmVudGVyc092ZXJUb3RhbCpSZW50Q29zdCArIE1vcnRnYWdvcnNPdmVyVG90YWwqTW9ydGdhZ29yQ29zdCArIE93bmVyT3ZlclRvdGFsKk93bmVyQ29zdCkgJT4lIAogIG11dGF0ZShDb3N0U2Vjb25kICAgICAgICAgID0gUmVudGVyc092ZXJUb3RhbCpSZW50Q29zdCArIE1vcnRBbmRPd25PdmVyVG90YWwqTWVkaWFuTW9ydEFuZE93bkNvc3QpICU+JSAKICBtdXRhdGUoRmlyc3RUb3RhbCAgICAgICAgICA9IFJlbnRlcnNPdmVyVG90YWwgICAgICAgICAgKyBNb3J0Z2Fnb3JzT3ZlclRvdGFsICsgICAgICAgICAgICAgICBPd25lck92ZXJUb3RhbCkgJT4lIAogIG11dGF0ZShTZWNvbmRUb3RhbCAgICAgICAgID0gUmVudGVyc092ZXJUb3RhbCAgICAgICAgICArIE1vcnRBbmRPd25PdmVyVG90YWwpICU+JSAKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygiR0VPSUQiLCAiTkFNRSIsICJOQU1FTFNBRCIpLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB5ZWFyLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygiUmVudENvc3QiLCAiTW9ydGdhZ29yQ29zdCIsICJPd25lckNvc3QiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWFuTW9ydEFuZE93bkNvc3QiLCAiUmVudGVycyIsICJNb3J0Z2Fnb3JzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk93bmVycyIsICJNb3J0QW5kT3duIiwgIk9jY3VwaWVkVG90YWwiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVudGVyc092ZXJUb3RhbCIsICJNb3J0Z2Fnb3JzT3ZlclRvdGFsIiwgIk93bmVyT3ZlclRvdGFsIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vcnRBbmRPd25PdmVyVG90YWwiLCAiQ29zdEZpcnN0IiwgIkNvc3RTZWNvbmQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWFuSG91c2luZ0Nvc3QiLCAiRmlyc3RUb3RhbCIsICJTZWNvbmRUb3RhbCIpKSAlPiUgCiAgbXV0YXRlKFBvaW50Q2hhbmdlRmlyc3QgICAgPSBDb3N0Rmlyc3RfMjAxOSAgICAgICAgICAgIC0gQ29zdEZpcnN0XzIwMTQpICU+JQogIG11dGF0ZShQb2ludENoYW5nZVNlY29uZCAgID0gQ29zdFNlY29uZF8yMDE5ICAgICAgICAgICAtIENvc3RTZWNvbmRfMjAxNCkKYGBgCgpgYGB7cn0KaGVhZChjb3N0czMpCmBgYAoKIyMgQnJpbmdpbmcgdGhlIHVuLXJlY29kZWQgTU9FcyBiYWNrIGludG8gdGhlIGRhdGFmcmFtZQoKYGBge3J9CmNvc3RzNCA8LSBjb3N0cyAlPiUKICBzZWxlY3QoeWVhciwgR0VPSUQsIE5BTUUsIE5BTUVMU0FELCBSZW50Q29zdE1PRSwgTW9ydGdhZ29yQ29zdE1PRSwgT3duZXJDb3N0TU9FLAogICAgICAgICBNZWRpYW5Nb3J0QW5kT3duTU9FLCBSZW50ZXJzTU9FLCBNb3J0Z2Fnb3JzTU9FLCBPd25lcnNNT0UsIE1vcnRBbmRPd25NT0UsCiAgICAgICAgIE9jY3VwaWVkVG90YWxNT0UsIE1lZGlhbkhvdXNpbmdDb3N0TU9FKSAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygiR0VPSUQiLCAiTkFNRSIsICJOQU1FTFNBRCIpLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB5ZWFyLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygiUmVudENvc3RNT0UiLCAiTW9ydGdhZ29yQ29zdE1PRSIsICJPd25lckNvc3RNT0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWVkaWFuTW9ydEFuZE93bk1PRSIsICJSZW50ZXJzTU9FIiwgIk1vcnRnYWdvcnNNT0UiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3duZXJzTU9FIiwgIk1vcnRBbmRPd25NT0UiLCAiT2NjdXBpZWRUb3RhbE1PRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNZWRpYW5Ib3VzaW5nQ29zdE1PRSIpKSAlPiUgCiAgZnVsbF9qb2luKC4sIGNvc3RzMywgYnkgPSBjKCJHRU9JRCIsICJOQU1FIiwgIk5BTUVMU0FEIikpCgpjdXQyIDwtIGNvc3RzNCRHRU9JRApgYGAKCmBgYHtyfQpoZWFkKGNvc3RzNCkKYGBgCgpgYGB7cn0KU0hQIDwtIG1hcF9kZnIoYygiV0EiLCAiT1IiLCAiTlYiLCAiQ0EiLCAiSUQiLCAiQVoiLCAiVVQiLAogICAgICAgICAgICAgICAgICJDTyIsICJOTSIsICJUWCIsICJPSyIsICJLUyIsICJORSIsICJTRCIsCiAgICAgICAgICAgICAgICAgIk5EIiwgIk1OIiwgIklBIiwgIk1PIiwgIkFSIiwgIkxBIiwgIldJIiwKICAgICAgICAgICAgICAgICAiSUwiLCAiS1kiLCAiVE4iLCAiTVMiLCAiRkwiLCAiQUwiLCAiR0EiLAogICAgICAgICAgICAgICAgICJTQyIsICJOQyIsICJWQSIsICJXViIsICJPSCIsICJNSSIsICJOWSIsCiAgICAgICAgICAgICAgICAgIlBBIiwgIlZUIiwgIk5IIiwgIk1FIiwgIk1BIiwgIlJJIiwgIkNUIiwKICAgICAgICAgICAgICAgICAiTkoiLCAiREUiLCAiTUQiLCAiREMiLCAiSU4iCiAgICAgICAgICAgICAgICAgKSwgfnsKICAgICAgICAgICAgICAgICAgIGNvdW50aWVzKC54LCBjYiA9IFRSVUUsIHllYXIgPSAyMDE0KX0pCgpTSFAyIDwtIGZpbHRlcihTSFAsIEdFT0lEICVpbiUgY3V0MikKClNIUDMgPC0gZ2VvX2pvaW4oU0hQMiwgY29zdHM0LCBieSA9IGMoIkdFT0lEIikpCgpTSFA0IDwtIFNIUDMgJT4lIG11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihUUlVFIH4gTkFNRUxTQUQpKQoKU0hQNSA8LSBncm91cF9ieShTSFA0LCBncm91cCkgJT4lIAogICAgc3VtbWFyaXplKGRvX3VuaW9uID0gVFJVRSkKCkNvc3RzTWFwIDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA0LCBhZXMoZmlsbCA9IFBvaW50Q2hhbmdlRmlyc3QpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJwZXJjZW50YWdlIHBvaW50IGNoYW5nZSBpbiBjb3N0cyBvdmVyIGluY29tZSB0aHJvdWdoIHRoZSAyMDEwcyIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtNi4wMCw2LjAwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC01LCAtNCwgLTMsIC0yLCAtMSwgMCwgMSwgMiwgMywgNCwgNSkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CkNvc3RzTWFwXzIwMTQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IFNIUDQsIGFlcyhmaWxsID0gQ29zdEZpcnN0XzIwMTQpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJjb3N0cyBvdmVyIGluY29tZSAyMDE0IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKDAsNDApLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMTIsIDE4LCAyNCwgMzAsIDM2KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KQ29zdHNNYXBfMjAxOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNCwgYWVzKGZpbGwgPSBDb3N0Rmlyc3RfMjAxOSksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gImNvc3RzIG92ZXIgaW5jb21lIDIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoMCw0MCksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygxMiwgMTgsIDI0LCAzMCwgMzYpKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpDb3N0c01hcF8yMDE0CmBgYAoKYGBge3J9CkNvc3RzTWFwXzIwMTkKYGBgCgpgYGB7cn0KQ29zdHNNYXAKYGBgCgojIyBBZ2dyaWdhdGluZyB0byB0aGUgTENTQSBieSB3ZWlnaHRpbmcgcmVzaWRlbnQgY29ob3J0cycgY29zdCBjb250cmlidXRpb24gdG8gdGhlIExDU0EgYnkgdGhlaXIgY291bnR5IGNvaG9ydHMgaW4gdGhlIG51bWVyYXRvciBhbmQgdGhlIHRvdGFsIG9mIExDU0Egb2NjdXBpZWQgdW5pdHMgaW4gdGhlIGRlbW9uaW5hdG9yCgpgYGB7cn0KY29zdHM1IDwtIGNvc3RzNCAlPiUgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFRSVUUgfiBOQU1FTFNBRCkpCgpjb3N0czYgPC0gZ3JvdXBfYnkoY29zdHM1LCBncm91cCkgJT4lCiAgbXV0YXRlKENTQW9jY3VwaWVkVG90YWxfMjAxNCAgICAgICA9IHN1bShPY2N1cGllZFRvdGFsXzIwMTQpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JQogIG11dGF0ZShDU0FvY2N1cGllZFRvdGFsXzIwMTkgICAgICAgPSBzdW0oT2NjdXBpZWRUb3RhbF8yMDE5KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKENTQXJlbnRlcnNfMjAxNCAgICAgICAgICAgICA9IHN1bShSZW50ZXJzXzIwMTQpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBcmVudGVyc18yMDE5ICAgICAgICAgICAgID0gc3VtKFJlbnRlcnNfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lCiAgbXV0YXRlKENTQW1vcnRnYWdvcnNfMjAxNCAgICAgICAgICA9IHN1bShNb3J0Z2Fnb3JzXzIwMTQpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBbW9ydGdhZ29yc18yMDE5ICAgICAgICAgID0gc3VtKE1vcnRnYWdvcnNfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lCiAgbXV0YXRlKENTQW93bmVyc18yMDE0ICAgICAgICAgICAgICA9IHN1bShPd25lcnNfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0Fvd25lcnNfMjAxOSAgICAgICAgICAgICAgPSBzdW0oT3duZXJzXzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JQogIG11dGF0ZShDU0Ftb3J0QU5Eb3duXzIwMTQgICAgICAgICAgPSBzdW0oTW9ydEFuZE93bl8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKENTQW1vcnRBTkRvd25fMjAxOSAgICAgICAgICA9IHN1bShNb3J0QW5kT3duXzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBcmVudGVyc092ZXJUb3RhbF8yMDE0ICAgID0gUmVudGVyc18yMDE0ICAgL0NTQW9jY3VwaWVkVG90YWxfMjAxNCkgJT4lIAogIG11dGF0ZShDU0FyZW50ZXJzT3ZlclRvdGFsXzIwMTkgICAgPSBSZW50ZXJzXzIwMTkgICAvQ1NBb2NjdXBpZWRUb3RhbF8yMDE5KSAlPiUKICBtdXRhdGUoQ1NBbW9ydGdhZ29yc092ZXJUb3RhbF8yMDE0ID0gTW9ydGdhZ29yc18yMDE0L0NTQW9jY3VwaWVkVG90YWxfMjAxNCkgJT4lIAogIG11dGF0ZShDU0Ftb3J0Z2Fnb3JzT3ZlclRvdGFsXzIwMTkgPSBNb3J0Z2Fnb3JzXzIwMTkvQ1NBb2NjdXBpZWRUb3RhbF8yMDE5KSAlPiUKICBtdXRhdGUoQ1NBb3duZXJzT3ZlclRvdGFsXzIwMTQgICAgID0gT3duZXJzXzIwMTQgICAgL0NTQW9jY3VwaWVkVG90YWxfMjAxNCkgJT4lIAogIG11dGF0ZShDU0Fvd25lcnNPdmVyVG90YWxfMjAxOSAgICAgPSBPd25lcnNfMjAxOSAgICAvQ1NBb2NjdXBpZWRUb3RhbF8yMDE5KSAlPiUKICBtdXRhdGUoQ1NBbW9ydEFORG93bk92ZXJUb3RhbF8yMDE0ID0gTW9ydEFuZE93bl8yMDE0L0NTQW9jY3VwaWVkVG90YWxfMjAxNCkgJT4lIAogIG11dGF0ZShDU0Ftb3J0QU5Eb3duT3ZlclRvdGFsXzIwMTkgPSBNb3J0QW5kT3duXzIwMTkvQ1NBb2NjdXBpZWRUb3RhbF8yMDE5KSAlPiUKICBtdXRhdGUoQ1NBY29zdEZpcnN0XzIwMTQgICAgICAgICAgID0KICAgICAgICAgICBzdW0oQ1NBcmVudGVyc092ZXJUb3RhbF8yMDE0KlJlbnRDb3N0XzIwMTQgICAgICAgICArCiAgICAgICAgICAgICAgIENTQW1vcnRnYWdvcnNPdmVyVG90YWxfMjAxNCpNb3J0Z2Fnb3JDb3N0XzIwMTQgKwogICAgICAgICAgICAgICBDU0Fvd25lcnNPdmVyVG90YWxfMjAxNCpPd25lckNvc3RfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0Fjb3N0Rmlyc3RfMjAxOSAgICAgICAgICAgPQogICAgICAgICAgIHN1bShDU0FyZW50ZXJzT3ZlclRvdGFsXzIwMTkqUmVudENvc3RfMjAxOSAgICAgICAgICsKICAgICAgICAgICAgICAgQ1NBbW9ydGdhZ29yc092ZXJUb3RhbF8yMDE5Kk1vcnRnYWdvckNvc3RfMjAxOSArCiAgICAgICAgICAgICAgIENTQW93bmVyc092ZXJUb3RhbF8yMDE5Kk93bmVyQ29zdF8yMDE5KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUKICBtdXRhdGUoQ1NBY29zdFNlY29uZF8yMDE0ICAgICAgICAgID0KICAgICAgICAgICBzdW0oQ1NBcmVudGVyc092ZXJUb3RhbF8yMDE0KlJlbnRDb3N0XzIwMTQgICAgICAgICArCiAgICAgICAgICAgICAgIENTQW1vcnRBTkRvd25PdmVyVG90YWxfMjAxNCpNZWRpYW5Nb3J0QW5kT3duQ29zdF8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKENTQWNvc3RTZWNvbmRfMjAxOSAgICAgICAgICA9CiAgICAgICAgICAgc3VtKENTQXJlbnRlcnNPdmVyVG90YWxfMjAxOSpSZW50Q29zdF8yMDE5ICAgICAgICAgKwogICAgICAgICAgICAgICBDU0Ftb3J0QU5Eb3duT3ZlclRvdGFsXzIwMTkqTWVkaWFuTW9ydEFuZE93bkNvc3RfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZSh0b3RfdGVzdCAgICAgICAgICAgICAgICAgICAgPQogICAgICAgICAgIHN1bShDU0FyZW50ZXJzT3ZlclRvdGFsXzIwMTQgICAgICAgICAgICAgICAgICAgICAgICsKICAgICAgICAgICAgICAgQ1NBbW9ydEFORG93bk92ZXJUb3RhbF8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKENTQXBvaW50Q2hhbmdlRmlyc3QgICAgICAgICA9IENTQWNvc3RGaXJzdF8yMDE5ICAtIENTQWNvc3RGaXJzdF8yMDE0KSAlPiUgCiAgbXV0YXRlKENTQXBvaW50Q2hhbmdlU2Vjb25kICAgICAgICA9IENTQWNvc3RTZWNvbmRfMjAxOSAtIENTQWNvc3RTZWNvbmRfMjAxNCkKYGBgCgpgYGB7cn0KaGVhZChjb3N0czYpCmBgYAoKYGBge3J9CmNvc3RzNyA8LSBjb3N0czYgJT4lCiAgc2VsZWN0KGdyb3VwLCBDU0Fwb2ludENoYW5nZUZpcnN0LCBDU0Fjb3N0Rmlyc3RfMjAxOSwgQ1NBY29zdEZpcnN0XzIwMTQpICU+JQogIGRpc3RpbmN0KC4sIGdyb3VwLCAua2VlcF9hbGwgPSBUUlVFKQoKU0hQNiA8LSBnZW9fam9pbihTSFA1LCBjb3N0czcsIGJ5ID0gYygiZ3JvdXAiKSkKCkNTQV9TSFAgPC0gZ2dwbG90KGRhdGEgPSBTSFA2LCBhZXMoZmlsbCA9IENTQXBvaW50Q2hhbmdlRmlyc3QpKSArCiAgbGFicyh0aXRsZSA9ICJwZXJjZW50YWdlIHBvaW50IGNoYW5nZSBpbiBjb3N0cyBvdmVyIGluY29tZSB0aHJvdWdoIHRoZSAyMDEwcyIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KQ1NBX1NIUF8yMDE0IDwtIGdncGxvdChkYXRhID0gU0hQNiwgYWVzKGZpbGwgPSBDU0Fjb3N0Rmlyc3RfMjAxNCkpICsKICBsYWJzKHRpdGxlID0gIkxDU0EgY29zdHMgb3ZlciBpbmNvbWUgMjAxNCIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMjUpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CkNTQV9TSFBfMjAxOSA8LSBnZ3Bsb3QoZGF0YSA9IFNIUDYsIGFlcyhmaWxsID0gQ1NBY29zdEZpcnN0XzIwMTkpKSArCiAgbGFicyh0aXRsZSA9ICJMQ1NBIGNvc3RzIG92ZXIgaW5jb21lIDIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDI1KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0FfU0hQXzIwMTQKYGBgCgpgYGB7cn0KQ1NBX1NIUF8yMDE5CmBgYAoKYGBge3J9CkNTQV9TSFAKYGBgCgojIyBTZWFyY2hpbmcgZm9yIGFueSBtaXNzaW5nIHZhbHVlcyBmb3Igc3RhcnRlcnMgaG9tZXMKCmBgYHtyfQpzdGFydGVycyA8LSByZWFkX2NzdigicGVybWl0cy5jc3YiKQoKaGVhZF9zdGFydCA8LSBzdGFydGVycyAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygiR0VPSUQiLCAiQ09VTlRZIiksCiAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IHllYXIsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjKCJTdGFydGVySG9tZVBlcm1pdHMiKSkgJT4lCiAgZmlsdGVyKEdFT0lEICVpbiUgY3V0MikgJT4lIAogIHNlbGVjdChHRU9JRCwgQ09VTlRZLCBwMTAgPSAiMjAxMCIsIHAxMSA9ICIyMDExIiwgcDEyID0gIjIwMTIiLCBwMTMgPSAiMjAxMyIsCiAgICAgICAgIHAxNCA9ICIyMDE0IiwgcDE1ID0gIjIwMTUiLCBwMTYgPSAiMjAxNiIsIHAxNyA9ICIyMDE3IiwgcDE4ID0gIjIwMTgiLAogICAgICAgICBwMTkgPSAiMjAxOSIpCgpoZWFkX3N0YXJ0JHAxMCA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihoZWFkX3N0YXJ0JHAxMCkpCmhlYWRfc3RhcnQkcDExIDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGhlYWRfc3RhcnQkcDExKSkKaGVhZF9zdGFydCRwMTIgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoaGVhZF9zdGFydCRwMTIpKQpoZWFkX3N0YXJ0JHAxMyA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihoZWFkX3N0YXJ0JHAxMykpCmhlYWRfc3RhcnQkcDE0IDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGhlYWRfc3RhcnQkcDE0KSkKaGVhZF9zdGFydCRwMTUgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoaGVhZF9zdGFydCRwMTUpKQpoZWFkX3N0YXJ0JHAxNiA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihoZWFkX3N0YXJ0JHAxNikpCmhlYWRfc3RhcnQkcDE3IDwtIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGhlYWRfc3RhcnQkcDE3KSkKaGVhZF9zdGFydCRwMTggPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoaGVhZF9zdGFydCRwMTgpKQpoZWFkX3N0YXJ0JHAxOSA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihoZWFkX3N0YXJ0JHAxOSkpCgpoZWFkX3N0YXJ0MiA8LSBmdWxsX2pvaW4oY29zdHM2LCBoZWFkX3N0YXJ0LCBieSA9ICJHRU9JRCIpICU+JQogIGZpbHRlcihpcy5uYShwMTApIHwgaXMubmEocDExKSB8IGlzLm5hKHAxMikgfCBpcy5uYShwMTMpIHwKICAgICAgICAgaXMubmEocDE0KSB8IGlzLm5hKHAxNSkgfCBpcy5uYShwMTYpIHwgaXMubmEocDE3KSB8CiAgICAgICAgIGlzLm5hKHAxOCkgfCBpcy5uYShwMTkpKSAlPiUKICBzZWxlY3QoR0VPSUQsIE5BTUUsIE5BTUVMU0FELCBwMTAsIHAxMSwgcDEyLCBwMTMsIHAxNCwgcDE1LAogICAgICAgICBwMTYsIHAxNywgcDE4LCBwMTkpCmBgYAoKYGBge3J9CmhlYWQoaGVhZF9zdGFydDIsIDIyKQpgYGAKCiMjIFRoZSBwcm9wb3J0aW9uYWwgYXZlcmFnZSBvZiBzdGFydGVyaG9tZXMgb3ZlciAyMDE5J3MgdG90YWwgdW5pdHMgd2lsbCBiZSB1c2VkIHRvIGdlbmVyYXRlIGEgbXVsdGlwbGllciBmb3IgdGhlIDIyIG1pc3NpbmcgdmFsdWVzLCB0aGlzIG1ha2VzIHNlbnNlIGJlY2F1c2UgaG91c2luZyBkZXZlbG9wbWVudCBib29tcyBhbmQgYnVzdHMgaW4gY29uanVjdGlvbiB5ZWFyIG92ZXIgeWVhciBpbiBhY2NvcmRhbmNlIHdpdGggZ2xvYmFsIG1hY3JvZWNvbm9taWMgdHJlbmRzIGluIGFsbCBhcmVhcyBpbiB0aGUgVVMuIFRoYXQncyB0aGUgcmVhc29uIGJ1aWxkaW5nIHBlcm1pdHMgYXJlIGluY2x1ZGVkIGluIHNvIG1hbnkgbGVhZGluZyBlY29ub21pYyBpbmRleGVzLgoKYGBge3J9CmN1dDMgPC0gaGVhZF9zdGFydDIkR0VPSUQKCmhvdXNpbmdfdW5pdHMgPC0gcmVhZF9jc3YoInVuaXRzLmNzdiIpCgpob3VzaW5nX3VuaXRzMiA8LSBob3VzaW5nX3VuaXRzICU+JQogIGZpbHRlcihHRU9JRCAlaW4lIGN1dDIpCgpob3VzaW5nX3VuaXRzMyA8LSBob3VzaW5nX3VuaXRzMiAlPiUKICBwaXZvdF93aWRlcihpZF9jb2xzID0gYygieWVhciIsIkdFT0lEIiwgIk5BTUUiKSwKICAgICAgICAgICAgICBuYW1lc19mcm9tID0gdmFyaWFibGUsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjKCJlc3RpbWF0ZSIsICJtb2UiKSkgJT4lCiAgcGl2b3Rfd2lkZXIoaWRfY29scyA9IGMoIkdFT0lEIiwgIk5BTUUiKSwKICAgICAgICAgICAgICBuYW1lc19mcm9tID0geWVhciwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoImVzdGltYXRlX0IyNTAwMl8wMDEiLCAibW9lX0IyNTAwMl8wMDEiKSkKICAKaG91c2luZ191bml0czQgPC0gaG91c2luZ191bml0czMgJT4lCiAgZmlsdGVyKCFHRU9JRCAlaW4lIGN1dDMpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwKICAgICAgICAgVW5pdHNfMjAxNCA9IGVzdGltYXRlX0IyNTAwMl8wMDFfMjAxNCwKICAgICAgICAgVW5pdHNfMjAxOSA9IGVzdGltYXRlX0IyNTAwMl8wMDFfMjAxOSwKICAgICAgICAgVW5pdHNNT0VfMjAxNCA9IG1vZV9CMjUwMDJfMDAxXzIwMTQsCiAgICAgICAgIFVuaXRzTU9FXzIwMTkgPSBtb2VfQjI1MDAyXzAwMV8yMDE5KQoKaG91c2luZ191bml0czUgPC0gZnVsbF9qb2luKGhvdXNpbmdfdW5pdHM0LCBoZWFkX3N0YXJ0LCBieSA9ICJHRU9JRCIpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgVW5pdHNfMjAxNCwgVW5pdHNfMjAxOSwKICAgICAgICAgcDEwLCBwMTEsIHAxMiwgcDEzLCBwMTQsCiAgICAgICAgIHAxNSwgcDE2LCBwMTcsIHAxOCwgcDE5LAogICAgICAgICBVbml0c01PRV8yMDE0LCBVbml0c01PRV8yMDE5KSAlPiUKICBmaWx0ZXIoIUdFT0lEICVpbiUgY3V0MykKCnVuaV90b3QgPC0gc3VtKGhvdXNpbmdfdW5pdHM1JFVuaXRzXzIwMTkpCnAxMF90b3QgPC0gc3VtKGhvdXNpbmdfdW5pdHM1JHAxMCkKcDExX3RvdCA8LSBzdW0oaG91c2luZ191bml0czUkcDExKQpwMTJfdG90IDwtIHN1bShob3VzaW5nX3VuaXRzNSRwMTIpCnAxM190b3QgPC0gc3VtKGhvdXNpbmdfdW5pdHM1JHAxMykKcDE0X3RvdCA8LSBzdW0oaG91c2luZ191bml0czUkcDE0KQpwMTVfdG90IDwtIHN1bShob3VzaW5nX3VuaXRzNSRwMTUpCnAxNl90b3QgPC0gc3VtKGhvdXNpbmdfdW5pdHM1JHAxNikKcDE3X3RvdCA8LSBzdW0oaG91c2luZ191bml0czUkcDE3KQpwMThfdG90IDwtIHN1bShob3VzaW5nX3VuaXRzNSRwMTgpCnAxOV90b3QgPC0gc3VtKGhvdXNpbmdfdW5pdHM1JHAxOSkKCndlaWdodDEwIDwtIHAxMF90b3QvdW5pX3RvdAp3ZWlnaHQxMSA8LSBwMTFfdG90L3VuaV90b3QKd2VpZ2h0MTIgPC0gcDEyX3RvdC91bmlfdG90CndlaWdodDEzIDwtIHAxM190b3QvdW5pX3RvdAp3ZWlnaHQxNCA8LSBwMTRfdG90L3VuaV90b3QKd2VpZ2h0MTUgPC0gcDE1X3RvdC91bmlfdG90CndlaWdodDE2IDwtIHAxNl90b3QvdW5pX3RvdAp3ZWlnaHQxNyA8LSBwMTdfdG90L3VuaV90b3QKd2VpZ2h0MTggPC0gcDE4X3RvdC91bmlfdG90CndlaWdodDE5IDwtIHAxOV90b3QvdW5pX3RvdAoKaG91c2luZ191bml0czYgPC0gaG91c2luZ191bml0czMgJT4lIGZpbHRlcihHRU9JRCAlaW4lIGN1dDMpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgVW5pdHNfMjAxNCA9IGVzdGltYXRlX0IyNTAwMl8wMDFfMjAxNCwKICAgICAgICAgVW5pdHNfMjAxOSA9IGVzdGltYXRlX0IyNTAwMl8wMDFfMjAxOSwgVW5pdHNNT0VfMjAxNCA9IG1vZV9CMjUwMDJfMDAxXzIwMTQsCiAgICAgICAgIFVuaXRzTU9FXzIwMTkgPSBtb2VfQjI1MDAyXzAwMV8yMDE5KQoKaG91c2luZ191bml0czcgPC0gbGVmdF9qb2luKGhvdXNpbmdfdW5pdHM2LCBoZWFkX3N0YXJ0MiwgYnkgPSBjKCJHRU9JRCIsICJOQU1FIikpICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwgVW5pdHNfMjAxNCwgVW5pdHNfMjAxOSwgcDEwLCBwMTEsCiAgICAgICAgIHAxMiwgcDEzLCBwMTQsIHAxNSwgcDE2LCBwMTcsIHAxOCwgcDE5LCBVbml0c01PRV8yMDE0LAogICAgICAgICBVbml0c01PRV8yMDE5KQpgYGAKCmBgYHtyfQpoZWFkKGhvdXNpbmdfdW5pdHM3LCAyMikKYGBgCgojIyBVc2luZyAyMDE5J3MgdG90YWwgdW5pdHMgZm9yIGFsbCB0ZW4geWVhcnMgbWFrZXMgc2Vuc2UgaGVyZSBiZWNhdXNlIHdlJ3JlIGJ1aWxkaW5nIHRvd2FyZCB0aGUgcHJlbnNlbnQgZGF5J3MgdG90YWwKCmBgYHtyfQpob3VzaW5nX3VuaXRzOCA8LSBob3VzaW5nX3VuaXRzNyAlPiUKICBtdXRhdGUocDEwID0gY2FzZV93aGVuKGlzLm5hKHAxMCkgfiBVbml0c18yMDE5KndlaWdodDEwLAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHAxMCkgfiBwMTApKSAlPiUgCiAgbXV0YXRlKHAxMCA9IHJvdW5kKHAxMCoxLCAwKSkgJT4lIAogIG11dGF0ZShwMTEgPSBjYXNlX3doZW4oaXMubmEocDExKSB+IFVuaXRzXzIwMTkqd2VpZ2h0MTEsCiAgICAgICAgICAgICAgICAgICAhaXMubmEocDExKSB+IHAxMSkpICU+JSAKICBtdXRhdGUocDExID0gcm91bmQocDExKjEsIDApKSAlPiUgCiAgbXV0YXRlKHAxMiA9IGNhc2Vfd2hlbihpcy5uYShwMTIpIH4gVW5pdHNfMjAxOSp3ZWlnaHQxMiwKICAgICAgICAgICAgICAgICAgICFpcy5uYShwMTIpIH4gcDEyKSkgJT4lIAogIG11dGF0ZShwMTIgPSByb3VuZChwMTIqMSwgMCkpICU+JSAKICBtdXRhdGUocDEzID0gY2FzZV93aGVuKGlzLm5hKHAxMykgfiBVbml0c18yMDE5KndlaWdodDEzLAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHAxMykgfiBwMTMpKSAlPiUgCiAgbXV0YXRlKHAxMyA9IHJvdW5kKHAxMyoxLCAwKSkgJT4lIAogIG11dGF0ZShwMTQgPSBjYXNlX3doZW4oaXMubmEocDE0KSB+IFVuaXRzXzIwMTkqd2VpZ2h0MTQsCiAgICAgICAgICAgICAgICAgICAhaXMubmEocDE0KSB+IHAxNCkpICU+JSAKICBtdXRhdGUocDE0ID0gcm91bmQocDE0KjEsIDApKSAlPiUgCiAgbXV0YXRlKHAxNSA9IGNhc2Vfd2hlbihpcy5uYShwMTUpIH4gVW5pdHNfMjAxOSp3ZWlnaHQxNSwKICAgICAgICAgICAgICAgICAgICFpcy5uYShwMTUpIH4gcDE1KSkgJT4lIAogIG11dGF0ZShwMTUgPSByb3VuZChwMTUqMSwgMCkpICU+JSAKICBtdXRhdGUocDE2ID0gY2FzZV93aGVuKGlzLm5hKHAxNikgfiBVbml0c18yMDE5KndlaWdodDE2LAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHAxNikgfiBwMTYpKSAlPiUgCiAgbXV0YXRlKHAxNiA9IHJvdW5kKHAxNioxLCAwKSkgJT4lIAogIG11dGF0ZShwMTcgPSBjYXNlX3doZW4oaXMubmEocDE3KSB+IFVuaXRzXzIwMTkqd2VpZ2h0MTcsCiAgICAgICAgICAgICAgICAgICAhaXMubmEocDE3KSB+IHAxNykpICU+JSAKICBtdXRhdGUocDE3ID0gcm91bmQocDE3KjEsIDApKSAlPiUgCiAgbXV0YXRlKHAxOCA9IGNhc2Vfd2hlbihpcy5uYShwMTgpIH4gVW5pdHNfMjAxOSp3ZWlnaHQxOCwKICAgICAgICAgICAgICAgICAgICFpcy5uYShwMTgpIH4gcDE4KSkgJT4lIAogIG11dGF0ZShwMTggPSByb3VuZChwMTgqMSwgMCkpICU+JSAKICBtdXRhdGUocDE5ID0gY2FzZV93aGVuKGlzLm5hKHAxOSkgfiBVbml0c18yMDE5KndlaWdodDE5LAogICAgICAgICAgICAgICAgICAgIWlzLm5hKHAxOSkgfiBwMTkpKSAlPiUgCiAgbXV0YXRlKHAxOSA9IHJvdW5kKHAxOSoxLCAwKSkKYGBgCgojIyBUaGVyZSdzIG5vIG5lZWQgdG8gY2xhcCwgYnV0IHlvdSBjYW4gaWYgeW91IHdhbnQgdG8KCmBgYHtyfQpoZWFkKGhvdXNpbmdfdW5pdHM4LCAyMikKYGBgCgojIyBMZXQncyBwdXQgdGhvc2UgY291bnRpZXMgYmFjayBpbnRvIHRoZSBtYWluIGRhdGFmcmFtZQoKYGBge3J9CmhvdXNpbmdfdW5pdHM5IDwtIGZ1bGxfam9pbihob3VzaW5nX3VuaXRzOCwgaG91c2luZ191bml0czUsCiAgICAgICAgICAgICAgICAgICAgYnkgPSBjKCJHRU9JRCIsICJOQU1FIiwgIlVuaXRzXzIwMTQiLCAiVW5pdHNfMjAxOSIsICJwMTAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAicDExIiwgInAxMiIsICJwMTMiLCAicDE0IiwgInAxNSIsICJwMTYiLCAicDE3IiwgInAxOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICJwMTkiLCAiVW5pdHNNT0VfMjAxNCIsICJVbml0c01PRV8yMDE5IikpICU+JSAKICBtdXRhdGUoTmV3U3RhcnRlcnNfMjAxNCAgICAgID0gcDEwK3AxMStwMTIrcDEzK3AxNCkgJT4lIAogIG11dGF0ZShOZXdTdGFydGVyc18yMDE5ICAgICAgPSBwMTUrcDE2K3AxNytwMTgrcDE5KSAlPiUgCiAgbXV0YXRlKFN0YXJ0ZXJPdmVyVG90UFBfMjAxNCA9IDEwMCooTmV3U3RhcnRlcnNfMjAxNC9Vbml0c18yMDE0KSkgJT4lIAogIG11dGF0ZShTdGFydGVyT3ZlclRvdFBQXzIwMTkgPSAxMDAqKE5ld1N0YXJ0ZXJzXzIwMTkvVW5pdHNfMjAxOSkpICU+JSAKICBtdXRhdGUoU3RhcnRlclJhdGlvUFBjaGFuZ2UgID0gU3RhcnRlck92ZXJUb3RQUF8yMDE5LVN0YXJ0ZXJPdmVyVG90UFBfMjAxNCkgJT4lIAogIG11dGF0ZShTdGFydGVyUmF0aW9EZWNhZGUgICAgPSAxMDAqKE5ld1N0YXJ0ZXJzXzIwMTQrTmV3U3RhcnRlcnNfMjAxOSkvVW5pdHNfMjAxOSkKCmhvdXNpbmdfdW5pdHMxMCA8LSBob3VzaW5nX3VuaXRzOSAlPiUKICBzZWxlY3QoIkdFT0lEIiwgIk5BTUUiLCAiVW5pdHNfMjAxNCIsICJVbml0c18yMDE5IiwiVW5pdHNNT0VfMjAxNCIsICJVbml0c01PRV8yMDE5IiwKICAgICAgICAgIk5ld1N0YXJ0ZXJzXzIwMTQiLCAiTmV3U3RhcnRlcnNfMjAxOSIsICJTdGFydGVyT3ZlclRvdFBQXzIwMTQiLCAiU3RhcnRlck92ZXJUb3RQUF8yMDE5IiwKICAgICAgICAgIlN0YXJ0ZXJSYXRpb1BQY2hhbmdlIiwgIlN0YXJ0ZXJSYXRpb0RlY2FkZSIpCgpjb3N0czggPC0gZnVsbF9qb2luKGhvdXNpbmdfdW5pdHMxMCwgY29zdHM2LCBieSA9IGMoIkdFT0lEIiwgIk5BTUUiKSkKYGBgCgpgYGB7cn0KU0hQNyA8LSBTSFAyICU+JSBzZWxlY3QoR0VPSUQsIE5BTUUsIGdlb21ldHJ5KQoKU0hQOCA8LSBnZW9fam9pbihTSFA3LCBjb3N0czgsIGJ5ID0gYygiR0VPSUQiKSkKCmxldHNfZ2V0X3N0YXJ0ZWQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IFNIUDgsIGFlcyhmaWxsID0gU3RhcnRlclJhdGlvUFBjaGFuZ2UpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJwZXJjZW50YWdlIHBvaW50IGNoYW5nZSBpbiBuZXcgc2luZ2xlLWZhbWlseSB1bml0IHBlcm1pdHMgb3ZlciB0b3RhbCB1bml0cyIsCiAgICAgICBzdWJ0aXRsZSA9ICIgMjAxMHMsIExDU0EgY291bnRpZXMiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTEzLDEzKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0xMCwgLTgsIC02LCAtNCwgLTIsIDAsIDIsIDQsIDYsIDgsIDEwKSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KbGV0c19nZXRfc3RhcnRlZF8yMDE0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA4LCBhZXMoZmlsbCA9IFN0YXJ0ZXJPdmVyVG90UFBfMjAxNCksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gInNpbmdsZS1mYW1pbHkgdW5pdCBwZXJtaXRzIG92ZXIgdG90YWwgdW5pdHMiLAogICAgICAgc3VidGl0bGUgPSAiIDIwMTQsIExDU0EgY291bnRpZXMiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTEwLDI2KSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDIsIDQsIDYsIDgsIDEwLCAxMiwgMTgpKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpsZXRzX2dldF9zdGFydGVkXzIwMTkgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IFNIUDgsIGFlcyhmaWxsID0gU3RhcnRlck92ZXJUb3RQUF8yMDE5KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAic2luZ2xlLWZhbWlseSB1bml0IHBlcm1pdHMgb3ZlciB0b3RhbCB1bml0cyIsCiAgICAgICBzdWJ0aXRsZSA9ICIgMjAxOSwgTENTQSBjb3VudGllcyIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtMTAsMjYpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMiwgNCwgNiwgOCwgMTAsIDEyLCAxOCkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CmxldHNfZ2V0X3N0YXJ0ZWRfMjAxNApgYGAKCmBgYHtyfQpsZXRzX2dldF9zdGFydGVkXzIwMTkKYGBgCgpgYGB7cn0KbGV0c19nZXRfc3RhcnRlZApgYGAKCmBgYHtyfQpTSFA3IDwtIFNIUDIgJT4lIHNlbGVjdChHRU9JRCwgTkFNRSwgZ2VvbWV0cnkpCgpTSFA4IDwtIGdlb19qb2luKFNIUDcsIGNvc3RzOCwgYnkgPSBjKCJHRU9JRCIpKQoKbGV0c19nZXRfc3RhcnRlZDEgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IFNIUDgsIGFlcyhmaWxsID0gU3RhcnRlclJhdGlvRGVjYWRlKSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicGVyY2VudGFnZSBvZiB0b3RhbCB1bml0cyBmcm9tIG5ldyBzaW5nbGUtZmFtaWx5IHVuaXQgcGVybWl0cyIsCiAgICAgICBzdWJ0aXRsZSA9ICIgMjAxMHMsIExDU0EgY291bnRpZXMiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTEzLDEzKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDIsIDQsIDYsIDgsIDEwKSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KbGV0c19nZXRfc3RhcnRlZDEKYGBgCgpgYGB7cn0KY29zdHM4IDwtIGdyb3VwX2J5KGNvc3RzOCwgZ3JvdXApICU+JQogIG11dGF0ZShDU0F1bml0c1RvdGFsXzIwMTkgPSBzdW0oVW5pdHNfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0F1bml0c1RvdGFsXzIwMTQgPSBzdW0oVW5pdHNfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0F1bml0c092ZXJUb3RhbFVuaXRzXzIwMTQgPSBVbml0c18yMDE0L0NTQXVuaXRzVG90YWxfMjAxNCkgJT4lIAogIG11dGF0ZShDU0F1bml0c092ZXJUb3RhbFVuaXRzXzIwMTkgPSBVbml0c18yMDE5L0NTQXVuaXRzVG90YWxfMjAxOSkgJT4lCiAgbXV0YXRlKENTQXN0YXJ0ZXJSYXRpb1BQY2hhbmdlICAgICA9IHN1bShDU0F1bml0c092ZXJUb3RhbFVuaXRzXzIwMTkqU3RhcnRlclJhdGlvUFBjaGFuZ2UpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBc3RhcnRlclJhdGlvRGVjYWRlICAgICAgID0gc3VtKENTQXVuaXRzT3ZlclRvdGFsVW5pdHNfMjAxOSpTdGFydGVyUmF0aW9EZWNhZGUpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBc3RhcnRlck92ZXJUb3RQUF8yMDE0ICAgID0gc3VtKENTQXVuaXRzT3ZlclRvdGFsVW5pdHNfMjAxNCpTdGFydGVyT3ZlclRvdFBQXzIwMTQpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBc3RhcnRlck92ZXJUb3RQUF8yMDE5ID0gc3VtKENTQXVuaXRzT3ZlclRvdGFsVW5pdHNfMjAxOSpTdGFydGVyT3ZlclRvdFBQXzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpCgpDU0FfU0hQMiA8LSBnZW9fam9pbihTSFA1LCBjb3N0czgsIGJ5ID0gYygiZ3JvdXAiKSkKCmxldHNfZ2V0X3N0YXJ0ZWQyIDwtIGdncGxvdChkYXRhID0gQ1NBX1NIUDIsIGFlcyhmaWxsID0gQ1NBc3RhcnRlclJhdGlvUFBjaGFuZ2UpKSArCiAgICAgbGFicyh0aXRsZSA9ICJMQ1NBIHBlcmNlbnRhZ2UgcG9pbnQgY2hhbmdlIGluIG5ldyBzaW5nbGUtZmFtaWx5IHVuaXQgcGVybWl0cyBvdmVyIHRvdGFsIHVuaXRzIiwKICAgICAgICAgIHN1YnRpdGxlID0gIiAyMDEwcyIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogICAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogICAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmxldHNfZ2V0X3N0YXJ0ZWRfMjAxNF8yIDwtIGdncGxvdChkYXRhID0gQ1NBX1NIUDIsIGFlcyhmaWxsID0gQ1NBc3RhcnRlck92ZXJUb3RQUF8yMDE0KSkgKwogICAgIGxhYnModGl0bGUgPSAiTENTQSBwZXJjZW50YWdlIG9mIG5ldyBzaW5nbGUtZmFtaWx5IHVuaXQgcGVybWl0cyBvdmVyIHRvdGFsIHVuaXRzIiwKICAgICAgICAgIHN1YnRpdGxlID0gIiAyMDE0IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAyKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KbGV0c19nZXRfc3RhcnRlZF8yMDE5XzIgPC0gZ2dwbG90KGRhdGEgPSBDU0FfU0hQMiwgYWVzKGZpbGwgPSBDU0FzdGFydGVyT3ZlclRvdFBQXzIwMTkpKSArCiAgICAgbGFicyh0aXRsZSA9ICJMQ1NBIHBlcmNlbnRhZ2Ugb2YgbmV3IHNpbmdsZS1mYW1pbHkgdW5pdCBwZXJtaXRzIG92ZXIgdG90YWwgdW5pdHMiLAogICAgICAgICAgc3VidGl0bGUgPSAiIDIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDIpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICAgIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICAgIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpsZXRzX2dldF9zdGFydGVkXzIwMTRfMgpgYGAKCmBgYHtyfQpsZXRzX2dldF9zdGFydGVkXzIwMTlfMgpgYGAKCmBgYHtyfQpsZXRzX2dldF9zdGFydGVkMgpgYGAKCmBgYHtyfQpsZXRzX2dldF9zdGFydGVkMjIgPC0gZ2dwbG90KGRhdGEgPSBDU0FfU0hQMiwgYWVzKGZpbGwgPSBDU0FzdGFydGVyUmF0aW9EZWNhZGUpKSArCiAgICAgbGFicyh0aXRsZSA9ICJMQ1NBIHBlcmNlbnRhZ2Ugb2YgdG90YWwgdW5pdHMgZnJvbSBuZXcgc2luZ2xlLWZhbWlseSB1bml0IHBlcm1pdHMiLAogICAgICAgICAgc3VidGl0bGUgPSAiIDIwMTBzIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KbGV0c19nZXRfc3RhcnRlZDIyCmBgYAoKIyMgRG9tZXN0aWMgbWlncmF0aW9uIGFtb25nIGNvdW50aWVzIHdpdGhpbiBhIExDU0EgYXMgd2VsbCBhcyBuZXQgbWlncmF0aW9uIGZvciBMQ1NBcwoKYGBge3J9CmZsb3dfMjAxNCA8LSByZWFkX2NzdigiZmxvd18yMDE0LmNzdiIpCgpmbG93XzIwMTkgPC0gcmVhZF9jc3YoImZsb3dfMjAxOS5jc3YiKQoKZmxvd18yMDE0XzIgPC0gZmxvd18yMDE0ICU+JQogIHBpdm90X3dpZGVyKC4sIGlkX2NvbHMgPSBjKCJHRU9JRDEiLCAiR0VPSUQyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlVMTDFfTkFNRSIsICJGVUxMMl9OQU1FIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IHZhcmlhYmxlLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygiZXN0aW1hdGUiLCAibW9lIikpICU+JSAKICBzZWxlY3QoLSJlc3RpbWF0ZV9NT1ZFRElOIiwgLSJlc3RpbWF0ZV9NT1ZFRE9VVCIsIC0ibW9lX01PVkVESU4iLAogICAgICAgICAtIm1vZV9NT1ZFRE9VVCIpCgpmbG93XzIwMTlfMiA8LSBmbG93XzIwMTkgJT4lCiAgcGl2b3Rfd2lkZXIoLiwgaWRfY29scyA9IGMoIkdFT0lEMSIsICJHRU9JRDIiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGVUxMMV9OQU1FIiwgIkZVTEwyX05BTUUiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICBuYW1lc19mcm9tID0gdmFyaWFibGUsCiAgICAgICAgICAgICAgdmFsdWVzX2Zyb20gPSBjKCJlc3RpbWF0ZSIsICJtb2UiKSkgJT4lIAogIHNlbGVjdCgtImVzdGltYXRlX01PVkVESU4iLCAtImVzdGltYXRlX01PVkVET1VUIiwgLSJtb2VfTU9WRURJTiIsCiAgICAgICAgIC0ibW9lX01PVkVET1VUIikKYGBgCgojI0xldCdzIHRyeSB0byBnZXQgZm9yZWlnbiBtaWdyYXRpb24gYXMgd2VsbAoKYGBge3J9CmZsb3dfMjAxNF9mb3IgPC0gZmxvd18yMDE0ICU+JQogIHBpdm90X3dpZGVyKC4sIGlkX2NvbHMgPSBjKCJHRU9JRDEiLCAiR0VPSUQyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRlVMTDFfTkFNRSIsICJGVUxMMl9OQU1FIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgICAgICAgbmFtZXNfZnJvbSA9IHZhcmlhYmxlLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygiZXN0aW1hdGUiLCAibW9lIikpICU+JSAKICBzZWxlY3QoLSJlc3RpbWF0ZV9NT1ZFRE5FVCIsIC0iZXN0aW1hdGVfTU9WRURPVVQiLCAtIm1vZV9NT1ZFRE5FVCIsCiAgICAgICAgIC0ibW9lX01PVkVET1VUIikKCmZsb3dfMjAxNF9mb3IgPC0gZmxvd18yMDE0X2ZvciAlPiUgZmlsdGVyKGlzLm5hKEdFT0lEMikpCiMtLS0tCmZsb3dfMjAxNF9mb3IgPC0gZmlsdGVyKGZsb3dfMjAxNF9mb3IsIEdFT0lEMSAlaW4lIGN1dDIpICU+JQogIHNlbGVjdChHRU9JRCA9IEdFT0lEMSwgR0VPSUQyLCBGVUxMMV9OQU1FLCBGVUxMMl9OQU1FLCBJTl8xNCA9IGVzdGltYXRlX01PVkVESU4sIElObW9lXzE0ID0gbW9lX01PVkVESU4pCgoKZmxvd18yMDE0X2ZvciA8LSBmdWxsX2pvaW4oZmxvd18yMDE0X2ZvciwgY29zdHMzLCBieSA9IGMoIkdFT0lEIikpICU+JSAKICBzZWxlY3QoR0VPSUQsIE5BTUUgPSBGVUxMMV9OQU1FLCBOQU1FTFNBRCwgcmVnaW9uID0gRlVMTDJfTkFNRSwgSU5fMTQsIElObW9lXzE0KQojdW5pcXVlKGZsb3dfMjAxNF9mb3IkcmVnaW9uKQoKZmxvd18yMDE0X2ZvciA8LSBmbG93XzIwMTRfZm9yICU+JSBtdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oVFJVRSB+IEdFT0lEKSkKCiMtLS0tCgpmbG93XzIwMTlfZm9yIDwtIGZsb3dfMjAxOSAlPiUKICBwaXZvdF93aWRlciguLCBpZF9jb2xzID0gYygiR0VPSUQxIiwgIkdFT0lEMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZVTEwxX05BTUUiLCAiRlVMTDJfTkFNRSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoImVzdGltYXRlIiwgIm1vZSIpKSAlPiUgCiAgc2VsZWN0KC0iZXN0aW1hdGVfTU9WRURORVQiLCAtImVzdGltYXRlX01PVkVET1VUIiwgLSJtb2VfTU9WRURORVQiLAogICAgICAgICAtIm1vZV9NT1ZFRE9VVCIpCgpmbG93XzIwMTlfZm9yIDwtIGZsb3dfMjAxOV9mb3IgJT4lIGZpbHRlcihpcy5uYShHRU9JRDIpKQojLS0tLQpmbG93XzIwMTlfZm9yIDwtIGZpbHRlcihmbG93XzIwMTlfZm9yLCBHRU9JRDEgJWluJSBjdXQyKSAlPiUKICBzZWxlY3QoR0VPSUQgPSBHRU9JRDEsIEdFT0lEMiwgRlVMTDFfTkFNRSwgRlVMTDJfTkFNRSwgSU5fMTkgPSBlc3RpbWF0ZV9NT1ZFRElOLCBJTm1vZV8xOSA9IG1vZV9NT1ZFRElOKQoKCmZsb3dfMjAxOV9mb3IgPC0gZnVsbF9qb2luKGZsb3dfMjAxOV9mb3IsIGNvc3RzMywgYnkgPSBjKCJHRU9JRCIpKSAlPiUgCiAgc2VsZWN0KEdFT0lELCBOQU1FID0gRlVMTDFfTkFNRSwgTkFNRUxTQUQsIHJlZ2lvbiA9IEZVTEwyX05BTUUsIElOXzE5LCBJTm1vZV8xOSkKI3VuaXF1ZShmbG93XzIwMTlfZm9yJHJlZ2lvbikKCmZsb3dfMjAxOV9mb3IgPC0gZmxvd18yMDE5X2ZvciAlPiUgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFRSVUUgfiBHRU9JRCkpCgp0aGVCSUdmb3IgPC0gbWVyZ2UoZmxvd18yMDE0X2ZvciwgZmxvd18yMDE5X2ZvciwKICAgICAgICAgICAgICAgICAgICBieT1jKCJHRU9JRCIgPSAiR0VPSUQiLCAiTkFNRSIgPSAiTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiTkFNRUxTQUQiID0gIk5BTUVMU0FEIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJyZWdpb24iID0gInJlZ2lvbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiZ3JvdXAiID0gImdyb3VwIiksCiAgICAgICAgICAgICAgICAgICAgYWxsID0gVFJVRSkKI3VuaXF1ZSh0aGVCSUdmb3IkcmVnaW9uKQoKIy0tLS0KdGhlQklHZm9yMiA8LSB0aGVCSUdmb3IgJT4lIHNlbGVjdCgtTkFNRSwgLXJlZ2lvbiwgLWdyb3VwKQoKaW5kZXggPC0gaXMubmEodGhlQklHZm9yMikKdGhlQklHZm9yMltpbmRleF0gPC0gMAoKdGhlQklHZm9yMiA8LSB0aGVCSUdmb3IyICU+JSBtdXRhdGUoSU5jb3VudHkxNF8xOSA9IElOXzE0ICsgSU5fMTkpCgp0aGVCSUdmb3IyIDwtIHRoZUJJR2ZvcjIgJT4lIG11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihUUlVFIH4gR0VPSUQpKQoKdGhlQklHZm9yMyA8LSBncm91cF9ieSh0aGVCSUdmb3IyLCBncm91cCkgJT4lIAogIHN1bW1hcmlzZShJTmNvdW50eVRvdDE0XzE5ID0gc3VtKElOY291bnR5MTRfMTkpLCBkb191bmlvbiA9IFRSVUUpICU+JQogIHNlbGVjdChHRU9JRCA9IGdyb3VwLCBJTmNvdW50eVRvdDE0XzE5KQoKdGhlQklHZm9yMzMgPC0gZ3JvdXBfYnkodGhlQklHZm9yMiwgZ3JvdXApICU+JQogIHN1bW1hcmlzZShJTmNvdW50eVRvdDE0ICAgID0gc3VtKElOXzE0KSwgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgc2VsZWN0KEdFT0lEID0gZ3JvdXAsIElOY291bnR5VG90MTQpCgp0aGVCSUdmb3IzMzMgPC0gZ3JvdXBfYnkodGhlQklHZm9yMiwgZ3JvdXApICU+JQogIHN1bW1hcmlzZShJTmNvdW50eVRvdDE5ICAgID0gc3VtKElOXzE5KSwgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgc2VsZWN0KEdFT0lEID0gZ3JvdXAsIElOY291bnR5VG90MTkpCmBgYAoKYGBge3J9CmhlYWQoZmxvd18yMDE0XzIpCmBgYAoKYGBge3J9CmZsb3dfMjAxNF9VUyA8LSBmbG93XzIwMTRfMiAlPiUKICByZW1vdmVfbWlzc2luZyhuYW1lID0gImVzdGltYXRlX01PVkVETkVUIikgCiNqdXN0IG5ldCBtaWdyYXRpb24sIHdoaWNoIG1lYW5zIG9ubHkgZG9tZXN0aWMKQ1NBY291bnRpZXNUbyA8LSBmaWx0ZXIoZmxvd18yMDE0X1VTLCBHRU9JRDEgJWluJSBjdXQyKQpgYGAKCmBgYHtyfQpoZWFkKENTQWNvdW50aWVzVG8sIDUwKQpgYGAKCmBgYHtyfQpDU0Fjb3VudGllc1RvYW5kRnJvbTIgPC0gZmlsdGVyKENTQWNvdW50aWVzVG8sIEdFT0lEMiAlaW4lIGN1dDIpICU+JQogIHNlbGVjdChHRU9JRCA9IEdFT0lEMSwgR0VPSUQyLCBGVUxMMV9OQU1FLCBGVUxMMl9OQU1FLCBORVQgPSBlc3RpbWF0ZV9NT1ZFRE5FVCwgTkVUbW9lID0gbW9lX01PVkVETkVUKQojb25seSBuZXQgbWlncmF0aW9uIGZyb20gb3RoZXIgTENTQSBjb3VudGllcwpiaWdfdGVzdCA8LSBmdWxsX2pvaW4oQ1NBY291bnRpZXNUb2FuZEZyb20yLCBjb3N0czMsIGJ5ID0gYygiR0VPSUQiKSkgJT4lIAogIHNlbGVjdChHRU9JRDEgPSBHRU9JRCwgR0VPSUQgPSBHRU9JRDIsIEZVTEwxX05BTUUsIE5BTUVMU0FEX0ZVTEwxX05BTUUgPSBOQU1FTFNBRCwgRlVMTDJfTkFNRSwgTkVULCBORVRtb2UpCgpiaWdfdGVzdDIgPC0gZnVsbF9qb2luKGJpZ190ZXN0LCBjb3N0czMsIGJ5ID0gYygiR0VPSUQiKSkgJT4lIAogIHNlbGVjdChHRU9JRDEsIEdFT0lEMiA9IEdFT0lELCBGVUxMMV9OQU1FLCBOQU1FTFNBRF9GVUxMMV9OQU1FLCBGVUxMMl9OQU1FLCBOQU1FTFNBRF9GVUxMMl9OQU1FID0gTkFNRUxTQUQsIE5FVCwgTkVUbW9lKQoKYmlnX3Rlc3QzIDwtIGJpZ190ZXN0MiAlPiUgZmlsdGVyKE5BTUVMU0FEX0ZVTEwxX05BTUUgPT0gTkFNRUxTQURfRlVMTDJfTkFNRSkKI29ubHkgbmV0IG1pZ3JhdGlvbiBmcm9tIG90aGVyIGNvdW50aWVzIHdpdGhpbiB0aGUgc2FtZSBMQ1NBCmJpZ190ZXN0NCA8LSBiaWdfdGVzdDMgJT4lIG11dGF0ZShncm91cCA9IGNhc2Vfd2hlbihUUlVFIH4gR0VPSUQxKSkKYGBgCgpgYGB7cn0KaGVhZChiaWdfdGVzdDQsIDUwKQpgYGAKCmBgYHtyfQpDU0Fjb3VudGllc1RvYW5kRnJvbTMgPC0gQ1NBY291bnRpZXNUbyAlPiUKICBzZWxlY3QoR0VPSUQgPSBHRU9JRDEsIEdFT0lEMiwgRlVMTDFfTkFNRSwgRlVMTDJfTkFNRSwgTkVUID0gZXN0aW1hdGVfTU9WRURORVQsIE5FVG1vZSA9IG1vZV9NT1ZFRE5FVCkKCmJpZ190ZXN0NSA8LSBmdWxsX2pvaW4oQ1NBY291bnRpZXNUb2FuZEZyb20zLCBjb3N0czMsIGJ5ID0gYygiR0VPSUQiKSkgJT4lIAogIHNlbGVjdChHRU9JRDEgPSBHRU9JRCwgR0VPSUQgPSBHRU9JRDIsIEZVTEwxX05BTUUsIE5BTUVMU0FEX0ZVTEwxX05BTUUgPSBOQU1FTFNBRCwgRlVMTDJfTkFNRSwgTkVULCBORVRtb2UpCgpiaWdfdGVzdDYgPC0gZnVsbF9qb2luKGJpZ190ZXN0NSwgY29zdHMzLCBieSA9IGMoIkdFT0lEIikpICU+JSAKICBzZWxlY3QoR0VPSUQxLCBHRU9JRDIgPSBHRU9JRCwgRlVMTDFfTkFNRSwgTkFNRUxTQURfRlVMTDFfTkFNRSwgRlVMTDJfTkFNRSwgTkFNRUxTQURfRlVMTDJfTkFNRSA9IE5BTUVMU0FELCBORVQsIE5FVG1vZSkKCmJpZ190ZXN0NyA8LSBiaWdfdGVzdDYgJT4lIGZpbHRlcihOQU1FTFNBRF9GVUxMMV9OQU1FICE9IE5BTUVMU0FEX0ZVTEwyX05BTUUgfCBpcy5uYShOQU1FTFNBRF9GVUxMMl9OQU1FKSkKI2RvbWVzdGljIG1pZ3JhdGlvbiBmcm9tIGNvdW50aWVzIE5PVCB3aXRoaW4gdGhlIHNhbWUgTENTQQpgYGAKCmBgYHtyfQpoZWFkKGJpZ190ZXN0NywgNTApCmBgYAoKYGBge3J9CmZsb3dfMjAxOV9VUyA8LSBmbG93XzIwMTlfMiAlPiUgcmVtb3ZlX21pc3NpbmcobmFtZSA9ICJlc3RpbWF0ZV9NT1ZFRE5FVCIpCgpDU0Fjb3VudGllc1RvMiA8LSBmaWx0ZXIoZmxvd18yMDE5X1VTLCBHRU9JRDEgJWluJSBjdXQyKQoKQ1NBY291bnRpZXNUb2FuZEZyb200IDwtIGZpbHRlcihDU0Fjb3VudGllc1RvMiwgR0VPSUQyICVpbiUgY3V0MikgJT4lCiAgc2VsZWN0KEdFT0lEID0gR0VPSUQxLCBHRU9JRDIsIEZVTEwxX05BTUUsIEZVTEwyX05BTUUsIE5FVCA9IGVzdGltYXRlX01PVkVETkVULCBORVRtb2UgPSBtb2VfTU9WRURORVQpCgpiaWdfdGVzdDkgPC0gZnVsbF9qb2luKENTQWNvdW50aWVzVG9hbmRGcm9tNCwgY29zdHMzLCBieSA9IGMoIkdFT0lEIikpICU+JSAKICBzZWxlY3QoR0VPSUQxID0gR0VPSUQsIEdFT0lEID0gR0VPSUQyLCBGVUxMMV9OQU1FLCBOQU1FTFNBRF9GVUxMMV9OQU1FID0gTkFNRUxTQUQsIEZVTEwyX05BTUUsIE5FVCwgTkVUbW9lKQoKYmlnX3Rlc3QxMCA8LSBmdWxsX2pvaW4oYmlnX3Rlc3Q5LCBjb3N0czMsIGJ5ID0gYygiR0VPSUQiKSkgJT4lIAogIHNlbGVjdChHRU9JRDEsIEdFT0lEMiA9IEdFT0lELCBGVUxMMV9OQU1FLCBOQU1FTFNBRF9GVUxMMV9OQU1FLCBGVUxMMl9OQU1FLCBOQU1FTFNBRF9GVUxMMl9OQU1FID0gTkFNRUxTQUQsIE5FVCwgTkVUbW9lKQoKYmlnX3Rlc3QxMSA8LSBiaWdfdGVzdDEwICU+JQogIGZpbHRlcihOQU1FTFNBRF9GVUxMMV9OQU1FID09IE5BTUVMU0FEX0ZVTEwyX05BTUUpCgpDU0Fjb3VudGllc1RvYW5kRnJvbTUgPC0gQ1NBY291bnRpZXNUbzIgJT4lCiAgc2VsZWN0KEdFT0lEID0gR0VPSUQxLCBHRU9JRDIsIEZVTEwxX05BTUUsIEZVTEwyX05BTUUsIE5FVCA9IGVzdGltYXRlX01PVkVETkVULCBORVRtb2UgPSBtb2VfTU9WRURORVQpCgpiaWdfdGVzdDEzIDwtIGZ1bGxfam9pbihDU0Fjb3VudGllc1RvYW5kRnJvbTUsIGNvc3RzMywgYnkgPSBjKCJHRU9JRCIpKSAlPiUgCiAgc2VsZWN0KEdFT0lEMSA9IEdFT0lELCBHRU9JRCA9IEdFT0lEMiwgRlVMTDFfTkFNRSwgTkFNRUxTQURfRlVMTDFfTkFNRSA9IE5BTUVMU0FELCBGVUxMMl9OQU1FLCBORVQsIE5FVG1vZSkKCmJpZ190ZXN0MTQgPC0gZnVsbF9qb2luKGJpZ190ZXN0MTMsIGNvc3RzMywgYnkgPSBjKCJHRU9JRCIpKSAlPiUKICBzZWxlY3QoR0VPSUQxLCBHRU9JRDIgPSBHRU9JRCwgRlVMTDFfTkFNRSwgTkFNRUxTQURfRlVMTDFfTkFNRSwgRlVMTDJfTkFNRSwgTkFNRUxTQURfRlVMTDJfTkFNRSA9IE5BTUVMU0FELCBORVQsIE5FVG1vZSkKCmJpZ190ZXN0MTUgPC0gYmlnX3Rlc3QxNCAlPiUgZmlsdGVyKE5BTUVMU0FEX0ZVTEwxX05BTUUgIT0gTkFNRUxTQURfRlVMTDJfTkFNRSB8IGlzLm5hKE5BTUVMU0FEX0ZVTEwyX05BTUUpKQoKYmlnX3Rlc3QxNF9JTnRlcm5hbCA8LSBiaWdfdGVzdDQgJT4lIHNlbGVjdChHRU9JRDEsIEZVTEwxX05BTUUsIE5BTUVMU0FEX0ZVTEwxX05BTUUsIEdFT0lEMiwgRlVMTDJfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FTFNBRF9GVUxMMl9OQU1FLCBpbk5FVF8xNCA9IE5FVCwgaW5ORVRtb2VfMTQgPSBORVRtb2UpCgpiaWdfdGVzdDE0X0VYdGVybmFsIDwtIGJpZ190ZXN0NyAlPiUgc2VsZWN0KEdFT0lEMSwgRlVMTDFfTkFNRSwgTkFNRUxTQURfRlVMTDFfTkFNRSwgR0VPSUQyLCBGVUxMMl9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BTUVMU0FEX0ZVTEwyX05BTUUsIGV4TkVUXzE0ID0gTkVULCBleE5FVG1vZV8xNCA9IE5FVG1vZSkKCmJpZ190ZXN0MTlfSU50ZXJuYWwgPC0gYmlnX3Rlc3QxMSAlPiUgc2VsZWN0KEdFT0lEMSwgRlVMTDFfTkFNRSwgTkFNRUxTQURfRlVMTDFfTkFNRSwgR0VPSUQyLCBGVUxMMl9OQU1FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FTFNBRF9GVUxMMl9OQU1FLCBpbk5FVF8xOSA9IE5FVCwgaW5ORVRtb2VfMTkgPSBORVRtb2UpCgpiaWdfdGVzdDE5X0VYdGVybmFsIDwtIGJpZ190ZXN0MTUgJT4lIHNlbGVjdChHRU9JRDEsIEZVTEwxX05BTUUsIE5BTUVMU0FEX0ZVTEwxX05BTUUsIEdFT0lEMiwgRlVMTDJfTkFNRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRUxTQURfRlVMTDJfTkFNRSwgZXhORVRfMTkgPSBORVQsIGV4TkVUbW9lXzE5ID0gTkVUbW9lKQoKdGhlQklHaW5ueTIgPC0gbWVyZ2UoYmlnX3Rlc3QxNF9JTnRlcm5hbCwgYmlnX3Rlc3QxOV9JTnRlcm5hbCwKICAgICAgICAgICAgICAgICAgICAgYnk9YygiR0VPSUQxIiA9ICJHRU9JRDEiLCAiRlVMTDFfTkFNRSIgPSAiRlVMTDFfTkFNRSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIk5BTUVMU0FEX0ZVTEwxX05BTUUiID0gIk5BTUVMU0FEX0ZVTEwxX05BTUUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJHRU9JRDIiID0gIkdFT0lEMiIsICJGVUxMMl9OQU1FIiA9ICJGVUxMMl9OQU1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiTkFNRUxTQURfRlVMTDJfTkFNRSIgPSAiTkFNRUxTQURfRlVMTDJfTkFNRSIpLAogICAgICAgICAgICAgICAgICAgICBhbGwgPSBUUlVFKQoKaW5kZXggPC0gaXMubmEodGhlQklHaW5ueTIpCgp0aGVCSUdpbm55MltpbmRleF0gPC0gMAoKdGhlQklHaW5ueTIgPC0gdGhlQklHaW5ueTIgJT4lCiAgbXV0YXRlKGluTkVUY291bnR5MTRfMTkgPSBpbk5FVF8xNCArIGluTkVUXzE5KQoKdGhlQklHaW5ueTIgPC0gdGhlQklHaW5ueTIgJT4lCiAgbXV0YXRlKGdyb3VwID0gY2FzZV93aGVuKFRSVUUgfiBHRU9JRDEpKQoKdGhlQklHaW5ueTMgPC0gZ3JvdXBfYnkodGhlQklHaW5ueTIsIGdyb3VwKSAlPiUKICBzdW1tYXJpc2UoaW5ORVRjb3VudHlUb3QxNF8xOSA9IHN1bShpbk5FVGNvdW50eTE0XzE5KSwgZG9fdW5pb24gPSBUUlVFKSAlPiUKICBzZWxlY3QoR0VPSUQgPSBncm91cCwgaW5ORVRjb3VudHlUb3QxNF8xOSkKCnRoZUJJR2lubnkzMyA8LSBncm91cF9ieSh0aGVCSUdpbm55MiwgZ3JvdXApICU+JQogIHN1bW1hcmlzZShpbk5FVGNvdW50eVRvdDE0ICAgID0gc3VtKGluTkVUXzE0KSwgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgc2VsZWN0KEdFT0lEID0gZ3JvdXAsIGluTkVUY291bnR5VG90MTQpCgp0aGVCSUdpbm55MzMzIDwtIGdyb3VwX2J5KHRoZUJJR2lubnkyLCBncm91cCkgJT4lCiAgc3VtbWFyaXNlKGluTkVUY291bnR5VG90MTkgICAgPSBzdW0oaW5ORVRfMTkpLCBkb191bmlvbiA9IFRSVUUpICU+JSAKICBzZWxlY3QoR0VPSUQgPSBncm91cCwgaW5ORVRjb3VudHlUb3QxOSkKCnRoZUJJR291dHkgPC0gbWVyZ2UoYmlnX3Rlc3QxNF9FWHRlcm5hbCwgYmlnX3Rlc3QxOV9FWHRlcm5hbCwKICAgICAgICAgICAgICAgICAgICBieT1jKCJHRU9JRDEiID0gIkdFT0lEMSIsICJGVUxMMV9OQU1FIiA9ICJGVUxMMV9OQU1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJOQU1FTFNBRF9GVUxMMV9OQU1FIiA9ICJOQU1FTFNBRF9GVUxMMV9OQU1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJHRU9JRDIiID0gIkdFT0lEMiIsICJGVUxMMl9OQU1FIiA9ICJGVUxMMl9OQU1FIiwKICAgICAgICAgICAgICAgICAgICAgICAgICJOQU1FTFNBRF9GVUxMMl9OQU1FIiA9ICJOQU1FTFNBRF9GVUxMMl9OQU1FIiksCiAgICAgICAgICAgICAgICAgICAgYWxsID0gVFJVRSkKCmluZGV4IDwtIGlzLm5hKHRoZUJJR291dHkpCnRoZUJJR291dHlbaW5kZXhdIDwtIDAKCnRoZUJJR291dHkgPC0gdGhlQklHb3V0eSAlPiUgbXV0YXRlKGV4TkVUY291bnR5MTRfMTkgPSBleE5FVF8xNCArIGV4TkVUXzE5KQoKdGhlQklHb3V0eSA8LSB0aGVCSUdvdXR5ICU+JSBtdXRhdGUoZ3JvdXAgPSBjYXNlX3doZW4oVFJVRSB+IEdFT0lEMSkpCgp0aGVCSUdvdXR5MiA8LSBncm91cF9ieSh0aGVCSUdvdXR5LCBncm91cCkgJT4lIAogIHN1bW1hcmlzZShleE5FVGNvdW50eVRvdDE0XzE5ID0gc3VtKGV4TkVUY291bnR5MTRfMTkpLCBkb191bmlvbiA9IFRSVUUpICU+JQogIHNlbGVjdChHRU9JRCA9IGdyb3VwLCBleE5FVGNvdW50eVRvdDE0XzE5KQoKdGhlQklHb3V0eTIyIDwtIGdyb3VwX2J5KHRoZUJJR291dHksIGdyb3VwKSAlPiUKICBzdW1tYXJpc2UoZXhORVRjb3VudHlUb3QxNCAgICA9IHN1bShleE5FVF8xNCksIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIHNlbGVjdChHRU9JRCA9IGdyb3VwLCBleE5FVGNvdW50eVRvdDE0KQoKdGhlQklHb3V0eTIyMiA8LSBncm91cF9ieSh0aGVCSUdvdXR5LCBncm91cCkgJT4lCiAgc3VtbWFyaXNlKGV4TkVUY291bnR5VG90MTkgICAgPSBzdW0oZXhORVRfMTkpLCBkb191bmlvbiA9IFRSVUUpICU+JSAKICBzZWxlY3QoR0VPSUQgPSBncm91cCwgZXhORVRjb3VudHlUb3QxOSkKCkxDU0FfMTMgPC0gZnVsbF9qb2luKGNvc3RzOCwgdGhlQklHaW5ueTMsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTMzIDwtIGZ1bGxfam9pbihMQ1NBXzEzLCB0aGVCSUdpbm55MzMsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTMzMyA8LSBmdWxsX2pvaW4oTENTQV8xMzMsIHRoZUJJR2lubnkzMzMsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTQgPC0gZnVsbF9qb2luKExDU0FfMTMzMywgdGhlQklHb3V0eTIsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTQ0IDwtIGZ1bGxfam9pbihMQ1NBXzE0LCB0aGVCSUdvdXR5MjIsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTQ0NCA8LSBmdWxsX2pvaW4oTENTQV8xNDQsIHRoZUJJR291dHkyMjIsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTQ0NDQgPC0gZnVsbF9qb2luKExDU0FfMTQ0NCwgdGhlQklHZm9yMywgYnkgPSBjKCJHRU9JRCIpKQoKTENTQV8xNDQ0NDQgPC0gZnVsbF9qb2luKExDU0FfMTQ0NDQsIHRoZUJJR2ZvcjMzLCBieSA9IGMoIkdFT0lEIikpCgpMQ1NBXzE0NDQ0NDQgPC0gZnVsbF9qb2luKExDU0FfMTQ0NDQ0LCB0aGVCSUdmb3IzMzMsIGJ5ID0gYygiR0VPSUQiKSkKCkxDU0FfMTUgPC0gZ3JvdXBfYnkoTENTQV8xNDQ0NDQ0LCBncm91cCkgJT4lCiAgbXV0YXRlKENTQWV4dGVybmFsTWlncmF0aW9uTkVUID0gc3VtKGV4TkVUY291bnR5VG90MTRfMTkpLCBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBZXhNaWdyYXRpb25ORVRfMTQgPSBzdW0oZXhORVRjb3VudHlUb3QxNCksIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0FleE1pZ3JhdGlvbk5FVF8xOSA9IHN1bShleE5FVGNvdW50eVRvdDE5KSwgZG9fdW5pb24gPSBUUlVFKQpgYGAKCmBgYHtyfQpoZWFkKExDU0FfMTUsIDUwKQpgYGAKIyMgSG93IHRvIGNvbmNlaXZlIG9mIHBvcHVsYXRpb24gcmVsYXRpdmUgdG8gZG9tZXN0aWMgbWlncmF0aW9uIHdoZXJlaW4gdGhlcmUgaXMgYSBvbmUgdG8gb25lIHJlbGF0aW9uc2hpcCBpcyB2ZXJ5IHN1YmplY3RpdmUsIEkgc2VlIHBlb3BsZSB3cmVzdGxlIHdpdGggdGhpcyB3aGVuIHRoZXkgb2ZmZXIgcXVhbnRpdGF0aXZlIGZpZ3VyZXMgb24gdGhlIG1hdHRlci4gSSB0aGluayBvZiBwb3B1bGF0aW9uIGluIHRoaXMgY29udGV4dCBhcyBhbiBhbW9ycGhvdXMgd2hvbGUuIFNvbWV0aGluZyB0aGF0IGV4cGFuZHMgYW5kIGNvbnRyYWN0cyBidXQgaXMgZnVuZGltZW50YWxseSA9IHRvIDEuIEFsc28gd29ydGggbm90aW5nIGlzIHRoYXQgdGhlIG1pZ3JhdGlvbiBmaWd1cmVzIGFyZSBmaXZlIHllYXIgZXN0aW1hdGVzLiBTbyBjb25zaWRlcmluZyB0aG9zZSBlc3RpbWF0ZXMgcmVsYXRpdmUgdG8gb3RoZXIgZXN0aW1hdGVzIGZyb20gYSBmaXZlIHllYXIgc3BhbiBsZW5kcyB0byB0aGUgd2hvbGUgImFtb3JwaG91cyB3aG9sZSIgcGFyYWRpZ20uIApgYGB7cn0KcG9wcHkgPC0gcmVhZF9jc3YoInBvcHB5LmNzdiIpCgpwb3BweSA8LSBwb3BweSAlPiUKICBwaXZvdF93aWRlciguLCBpZF9jb2xzID0gYygieWVhciIsICJHRU9JRCIpLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoImVzdGltYXRlIiwgIm1vZSIpKQoKcG9wcHkgPC0gcG9wcHkgJT4lIAogIHBpdm90X3dpZGVyKC4sIGlkX2NvbHMgPSBjKCJHRU9JRCIpLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB5ZWFyLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygiZXN0aW1hdGVfQjAxMDAxXzAwMSIsICJtb2VfQjAxMDAxXzAwMSIpKQoKcG9wcHkgPC0gcG9wcHkgJT4lIHNlbGVjdChHRU9JRCwgVG90YWxQb3BfMjAxOSA9ICJlc3RpbWF0ZV9CMDEwMDFfMDAxXzIwMTkiLCBUb3RhbFBvcE1PRV8yMDE5ID0gIm1vZV9CMDEwMDFfMDAxXzIwMTkiLAogICAgICAgICAgICAgICAgICAgICAgICAgIFRvdGFsUG9wXzIwMTQgPSAiZXN0aW1hdGVfQjAxMDAxXzAwMV8yMDE0IiwgVG90YWxQb3BNT0VfMjAxNCA9ICJtb2VfQjAxMDAxXzAwMV8yMDE0IikKCkxDU0FfMTYgPC0gZnVsbF9qb2luKExDU0FfMTUsIHBvcHB5LCBieSA9IGMoIkdFT0lEIikpCgpMQ1NBXzE3IDwtIExDU0FfMTYgJT4lIAogIG11dGF0ZShDU0Fwb3BUb3RhbF8yMDE5ID0gc3VtKFRvdGFsUG9wXzIwMTksIGRvX3VuaW9uID0gVFJVRSkpICU+JSAKICBtdXRhdGUoQ1NBcG9wVG90YWxfMjAxNCA9IHN1bShUb3RhbFBvcF8yMDE0LCBkb191bmlvbiA9IFRSVUUpKSAlPiUgCiAgbXV0YXRlKHBvaW50Y29udHJpYnV0aW9uRnJvbUludGVybmFsICAgID0gKGluTkVUY291bnR5VG90MTRfMTkgICAgICAgIC9Ub3RhbFBvcF8yMDE5KSoxMDApICU+JSAKICBtdXRhdGUocG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWwgICAgPSAoZXhORVRjb3VudHlUb3QxNF8xOSAgICAgICAgL1RvdGFsUG9wXzIwMTkpKjEwMCkgJT4lIAogIG11dGF0ZShDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbCA9IChDU0FleHRlcm5hbE1pZ3JhdGlvbk5FVCAgICAvQ1NBcG9wVG90YWxfMjAxOSkqMTAwLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JQogIG11dGF0ZShDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbF8xNCA9IChDU0FleE1pZ3JhdGlvbk5FVF8xNCAgICAvQ1NBcG9wVG90YWxfMjAxNCkqMTAwLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JQogIG11dGF0ZShDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbF8xOSA9IChDU0FleE1pZ3JhdGlvbk5FVF8xOSAgICAvQ1NBcG9wVG90YWxfMjAxOSkqMTAwLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JQogIG11dGF0ZShDU0Fwb2ludENoYW5nZUV4dGVybmFsID0gKENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsXzE5IC0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWxfMTQpKSAlPiUgCiAgbXV0YXRlKHBvaW50RnJvbUludGVybmFsXzIwMTQgICAgICAgICAgID0gKGluTkVUY291bnR5VG90MTQgICAgICAgICAgIC9Ub3RhbFBvcF8yMDE0KSoxMDApICU+JSAKICBtdXRhdGUocG9pbnRGcm9tSW50ZXJuYWxfMjAxOSAgICAgICAgICAgPSAoaW5ORVRjb3VudHlUb3QxOSAgICAgICAgICAgL1RvdGFsUG9wXzIwMTkpKjEwMCkgJT4lIAogIG11dGF0ZShwb2ludENoYW5nZUludGVybmFsICAgICAgICAgICAgICA9IChwb2ludEZyb21JbnRlcm5hbF8yMDE5IC0gcG9pbnRGcm9tSW50ZXJuYWxfMjAxNCkpICU+JSAKICBtdXRhdGUocG9pbnRGcm9tRXh0ZXJuYWxfMjAxNCAgICAgICAgICAgPSAoZXhORVRjb3VudHlUb3QxNCAgICAgICAgICAgL1RvdGFsUG9wXzIwMTQpKjEwMCkgJT4lIAogIG11dGF0ZShwb2ludEZyb21FeHRlcm5hbF8yMDE5ICAgICAgICAgICA9IChleE5FVGNvdW50eVRvdDE5ICAgICAgICAgICAvVG90YWxQb3BfMjAxOSkqMTAwKSAlPiUgCiAgbXV0YXRlKHBvaW50Q2hhbmdlRXh0ZXJuYWwgICAgICAgICAgICAgID0gKHBvaW50RnJvbUV4dGVybmFsXzIwMTkgLSBwb2ludEZyb21FeHRlcm5hbF8yMDE0KSkgJT4lIAogIG11dGF0ZShwb2ludEZyb21Gb3JlaWduXzIwMTQgPSAoSU5jb3VudHlUb3QxNC9Ub3RhbFBvcF8yMDE0KSAqMTAwKSAlPiUgCiAgbXV0YXRlKHBvaW50RnJvbUZvcmVpZ25fMjAxOSA9IChJTmNvdW50eVRvdDE5L1RvdGFsUG9wXzIwMTkpICoxMDApICU+JQogIG11dGF0ZShwb2ludENoYW5nZUZvcmVpZ24gPSBwb2ludEZyb21Gb3JlaWduXzIwMTkgLSBwb2ludEZyb21Gb3JlaWduXzIwMTQpICU+JSAKICBtdXRhdGUocG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbiA9IChJTmNvdW50eVRvdDE0XzE5L1RvdGFsUG9wXzIwMTkpKjEwMCkgJT4lIAogIG11dGF0ZShDU0Fmb3JlaWduMTQgPSBzdW0oSU5jb3VudHlUb3QxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0Fmb3JlaWduMTkgPSBzdW0oSU5jb3VudHlUb3QxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShDU0Fmb3JlaWduTWlncmF0aW9uID0gc3VtKElOY291bnR5VG90MTRfMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbl8xNCA9IChDU0Fmb3JlaWduMTQvQ1NBcG9wVG90YWxfMjAxNCkqMTAwLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JQogIG11dGF0ZShDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduXzE5ID0gKENTQWZvcmVpZ24xOS9DU0Fwb3BUb3RhbF8yMDE5KSoxMDAsCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lCiAgbXV0YXRlKENTQXBvaW50Q2hhbmdlRm9yZWlnbiA9IChDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduXzE5IC0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbl8xNCkpICU+JSAKICBtdXRhdGUoQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbiA9IChDU0Fmb3JlaWduTWlncmF0aW9uL0NTQXBvcFRvdGFsXzIwMTkpKjEwMCwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKQogIAogIApgYGAKCmBgYHtyfQpoZWFkKExDU0FfMTcsIDUwKQpgYGAKCmBgYHtyfQpjb3VudGllc1NIUDYgPC0gU0hQMiAlPiUgc2VsZWN0KEdFT0lELCBnZW9tZXRyeSkKCmNvdW50aWVzU0hQOCA8LSBnZW9fam9pbihjb3VudGllc1NIUDYsIExDU0FfMTcsIGJ5ID0gYygiR0VPSUQiKSkKY29sbmFtZXMoY291bnRpZXNTSFA4KQpDaGFuZ2UzIDwtIGdncGxvdCgpICsKICAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFA4LCBhZXMoZmlsbCA9IHBvaW50Y29udHJpYnV0aW9uRnJvbUludGVybmFsKSwgY29sb3IgPSBOQSkgKwogICBsYWJzKHRpdGxlID0gInBlcmNlbnRhZ2UgcG9pbnQgY29udHJpYnV0aW9uIHRvIGNvdW50eSBwb3B1bGF0aW9uIiwKICAgICAgICBzdWJ0aXRsZSA9ICIgMjAxMHMgbmV0IGRvbWVzdGljIG1pZ3JhdGlvbiBmcm9tIGNvdW50aWVzIHdpdGhpbiBMQ1NBIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0xMywxMyksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtMTAsIC02LCAtMiwgMCwgMiwgNiwgMTApKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpDaGFuZ2VQb2ludF8yMDE0IDwtIGdncGxvdCgpICsKICAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFA4LCBhZXMoZmlsbCA9IHBvaW50RnJvbUludGVybmFsXzIwMTQpLCBjb2xvciA9IE5BKSArCiAgIGxhYnModGl0bGUgPSAicG9pbnQgY29udHJpYnV0aW9uIHRvIDIwMTQgY291bnR5IHBvcHVsYXRpb24iLAogICAgICAgIHN1YnRpdGxlID0gIiBOZXQgZG9tZXN0aWMgbWlncmF0aW9uIGZyb20gY291bnRpZXMgd2l0aGluIExDU0EiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTgsOCksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtNiwgLTQsIC0yLCAwLCAyLCA2KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KQ2hhbmdlUG9pbnRfMjAxOSA8LSBnZ3Bsb3QoKSArCiAgIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQOCwgYWVzKGZpbGwgPSBwb2ludEZyb21JbnRlcm5hbF8yMDE5KSwgY29sb3IgPSBOQSkgKwogICBsYWJzKHRpdGxlID0gInBvaW50IGNvbnRyaWJ1dGlvbiB0byAyMDE5IGNvdW50eSBwb3B1bGF0aW9uIiwKICAgICAgICBzdWJ0aXRsZSA9ICIgTmV0IGRvbWVzdGljIG1pZ3JhdGlvbiBmcm9tIGNvdW50aWVzIHdpdGhpbiBMQ1NBIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC04LDgpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTYsIC00LCAtMiwgMCwgMiwgNikpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CkNoYW5nZVBvaW50XzE0XzE5IDwtIGdncGxvdCgpICsKICAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFA4LCBhZXMoZmlsbCA9IHBvaW50Q2hhbmdlSW50ZXJuYWwpLCBjb2xvciA9IE5BKSArCiAgIGxhYnModGl0bGUgPSAicG9pbnQgY2hhbmdlIGZyb20gMjAxNCB0byAyMDE5IGNvdW50eSBwb3B1bGF0aW9uIiwKICAgICAgICBzdWJ0aXRsZSA9ICIgTmV0IGRvbWVzdGljIG1pZ3JhdGlvbiBmcm9tIGNvdW50aWVzIHdpdGhpbiBMQ1NBIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0yLDIpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTEsIDAsIDEpKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpDaGFuZ2VQb2ludF8yMDE0CmBgYAoKYGBge3J9CkNoYW5nZVBvaW50XzIwMTkKYGBgCgpgYGB7cn0KQ2hhbmdlUG9pbnRfMTRfMTkKYGBgCgpgYGB7cn0KQ2hhbmdlMwpgYGAKCmBgYHtyfQpDaGFuZ2U0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDgsIGFlcyhmaWxsID0gcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWwpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJwZXJjZW50YWdlIHBvaW50IGNvbnRyaWJ1dGlvbiB0byBjb3VudHkgcG9wdWxhdGlvbiIsCiAgICAgICBzdWJ0aXRsZSA9ICIgMjAxMHMgZXh0ZXJuYWwgbmV0IG1pZ3JhdGlvbiBmcm9tIGNvdW50aWVzIG91dHNpZGUgb2Ygc2hhcmVkIExDU0EiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTI1LDI1KSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0yMCwgLTEwLCAwLCAxMCwgMjApKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpDaGFuZ2VQb2ludF9leDIwMTQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQOCwgYWVzKGZpbGwgPSBwb2ludEZyb21FeHRlcm5hbF8yMDE0KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnQgY29udHJpYnV0aW9uIHRvIDIwMTQgY291bnR5IHBvcHVsYXRpb24iLAogICAgICAgIHN1YnRpdGxlID0gIiBMQ1NBIGV4dGVybmFsIG5ldCBtaWdyYXRpb24iLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTE1LDE1KSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0xMCwgLTUsIDAsIDUsIDEwLCAxNSkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CkNoYW5nZVBvaW50X2V4MjAxOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFA4LCBhZXMoZmlsbCA9IHBvaW50RnJvbUV4dGVybmFsXzIwMTkpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJwb2ludCBjb250cmlidXRpb24gdG8gMjAxOSBjb3VudHkgcG9wdWxhdGlvbiIsCiAgICAgICAgc3VidGl0bGUgPSAiIExDU0EgZXh0ZXJuYWwgbmV0IG1pZ3JhdGlvbiIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtMTUsMTUpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTEwLCAtNSwgMCwgNSwgMTAsIDE1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KQ2hhbmdlUG9pbnRfZXhfMTRfMTkgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQOCwgYWVzKGZpbGwgPSBwb2ludENoYW5nZUV4dGVybmFsKSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnQgY2hhbmdlIGZyb20gMjAxNCB0byAyMDE5IGNvdW50eSBwb3B1bGF0aW9uIiwKICAgICAgICBzdWJ0aXRsZSA9ICIgTENTQSBleHRlcm5hbCBuZXQgbWlncmF0aW9uIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0xLjUsMS41KSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0xLjI1LCAtMSwgLS43NSwgLS41LCAtLjI1LCAwLCAuMjUpKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpDaGFuZ2VQb2ludF9leDIwMTQKYGBgCgpgYGB7cn0KQ2hhbmdlUG9pbnRfZXgyMDE5CmBgYAoKYGBge3J9CkNoYW5nZVBvaW50X2V4XzE0XzE5CmBgYAoKYGBge3J9CkNoYW5nZTQKYGBgCgpgYGB7cn0KTENTQV8xNyA8LSBMQ1NBXzE3ICU+JSAKICBtdXRhdGUoQ1NBc3RhcnRlclJhdGlvRGVjYWRlICAgICAgID0gc3VtKENTQXVuaXRzT3ZlclRvdGFsVW5pdHNfMjAxOSpTdGFydGVyUmF0aW9EZWNhZGUpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpCgpDU0FzaHAzIDwtIGdlb19qb2luKFNIUDUsIExDU0FfMTcsIGJ5ID0gYygiZ3JvdXAiKSkKCkNTQWNoYW5nZTMgPC0gZ2dwbG90KGRhdGEgPSBDU0FzaHAzLCBhZXMoZmlsbCA9IENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsKSkgKwogICAgIGxhYnModGl0bGUgPSAicGVyY2VudGFnZSBwb2ludCBjb250cmlidXRpb24gdG8gcG9wdWxhdGlvbiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICIgMjAxMHMgbmV0IG1pZ3JhdGlvbiIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0FjaGFuZ2UxNCA8LSBnZ3Bsb3QoZGF0YSA9IENTQXNocDMsIGFlcyhmaWxsID0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWxfMTQpKSArCiAgICAgbGFicyh0aXRsZSA9ICJwb2ludCBjb250cmlidXRpb24gdG8gMjAxNCBMQ1NBIHBvcHVsYXRpb24iLAogICAgICAgICAgc3VidGl0bGUgPSAiIExDU0EgbmV0IG1pZ3JhdGlvbiIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0FjaGFuZ2UxOSA8LSBnZ3Bsb3QoZGF0YSA9IENTQXNocDMsIGFlcyhmaWxsID0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWxfMTkpKSArCiAgICAgbGFicyh0aXRsZSA9ICJwb2ludCBjb250cmlidXRpb24gdG8gMjAxOSBMQ1NBIHBvcHVsYXRpb24iLAogICAgICAgICAgc3VidGl0bGUgPSAiIExDU0EgbmV0IG1pZ3JhdGlvbiIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0Fwb2ludENoYW5nZSA8LSBnZ3Bsb3QoZGF0YSA9IENTQXNocDMsIGFlcyhmaWxsID0gQ1NBcG9pbnRDaGFuZ2VFeHRlcm5hbCkpICsKICAgICBsYWJzKHRpdGxlID0gInBvaW50IGNoYW5nZSBpbiBMQ1NBIG1pZ3JhdGlvbiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICIgTENTQSBuZXQgbWlncmF0aW9uIiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CkNTQWNoYW5nZTE0CmBgYAoKYGBge3J9CkNTQWNoYW5nZTE5CmBgYAoKYGBge3J9CkNTQXBvaW50Q2hhbmdlCmBgYAoKYGBge3J9CkNTQWNoYW5nZTMKYGBgCgojIyBGb3JlaWduIG1pZ3JhdGlvbgoKYGBge3J9CmZvckNoYW5nZTQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQOCwgYWVzKGZpbGwgPSBwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduKSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicGVyY2VudGFnZSBwb2ludCBjb250cmlidXRpb24gdG8gY291bnR5IHBvcHVsYXRpb24iLAogICAgICAgc3VidGl0bGUgPSAiIDIwMTBzIGZvcmVpZ24gaW1taWdyYXRpb24iLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTUsNyksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCAuMjUsIDEsIDIsIDQsIDYpKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpDaGFuZ2VQb2ludF9mb3IyMDE0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDgsIGFlcyhmaWxsID0gcG9pbnRGcm9tRm9yZWlnbl8yMDE0KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnQgY29udHJpYnV0aW9uIHRvIDIwMTQgY291bnR5IHBvcHVsYXRpb24iLAogICAgICAgIHN1YnRpdGxlID0gIiBmb3JlaWduIGltbWlncmF0aW9uIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC00LDQpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgLjMsIC42LCAxLjIsIDEuOCwgMi40LCAzKSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KQ2hhbmdlUG9pbnRfZm9yMjAxOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFA4LCBhZXMoZmlsbCA9IHBvaW50RnJvbUZvcmVpZ25fMjAxOSksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gInBvaW50IGNvbnRyaWJ1dGlvbiB0byAyMDE5IGNvdW50eSBwb3B1bGF0aW9uIiwKICAgICAgICBzdWJ0aXRsZSA9ICIgZm9yZWlnbiBpbW1pZ3JhdGlvbiIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtNCw0KSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIC4zLCAuNiwgMS4yLCAxLjgsIDIuNCwgMykpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CkNoYW5nZVBvaW50X2Zvcl8xNF8xOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFA4LCBhZXMoZmlsbCA9IHBvaW50Q2hhbmdlRm9yZWlnbiksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gInBvaW50IGNoYW5nZSBmcm9tIDIwMTQgdG8gMjAxOSBjb3VudHkgcG9wdWxhdGlvbiIsCiAgICAgICAgc3VidGl0bGUgPSAiIGZvcmVpZ24gaW1taWdyYXRpb24iLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTMsNSksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtMiwgLS41LCAuNzUsIDEuNSwgNCkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CkNoYW5nZVBvaW50X2ZvcjIwMTQKYGBgCgpgYGB7cn0KQ2hhbmdlUG9pbnRfZm9yMjAxOQpgYGAKCmBgYHtyfQpDaGFuZ2VQb2ludF9mb3JfMTRfMTkKYGBgCgpgYGB7cn0KZm9yQ2hhbmdlNApgYGAKICAgCmBgYHtyfQpDU0FjaGFuZ2UzZm9yIDwtIGdncGxvdChkYXRhID0gQ1NBc2hwMywgYWVzKGZpbGwgPSBDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduKSkgKwogICAgIGxhYnModGl0bGUgPSAicGVyY2VudGFnZSBwb2ludCBjb250cmlidXRpb24gdG8gcG9wdWxhdGlvbiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICIgMjAxMHMgZm9yZWlnbiBpbW1pZ3JhdGlvbiIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAxKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0FjaGFuZ2UxNGZvciA8LSBnZ3Bsb3QoZGF0YSA9IENTQXNocDMsIGFlcyhmaWxsID0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbl8xNCkpICsKICAgICBsYWJzKHRpdGxlID0gInBvaW50IGNvbnRyaWJ1dGlvbiB0byAyMDE0IExDU0EgcG9wdWxhdGlvbiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICIgTENTQSBmb3JlaWduIGltbWlncmF0aW9uIiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IC41KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0FjaGFuZ2UxOWZvciA8LSBnZ3Bsb3QoZGF0YSA9IENTQXNocDMsIGFlcyhmaWxsID0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbl8xOSkpICsKICAgICBsYWJzKHRpdGxlID0gInBvaW50IGNvbnRyaWJ1dGlvbiB0byAyMDE5IExDU0EgcG9wdWxhdGlvbiIsCiAgICAgICAgICBzdWJ0aXRsZSA9ICIgTENTQSBmb3JlaWduIGltbWlncmF0aW9uIiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IC41KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpDU0Fwb2ludENoYW5nZWZvciA8LSBnZ3Bsb3QoZGF0YSA9IENTQXNocDMsIGFlcyhmaWxsID0gQ1NBcG9pbnRDaGFuZ2VGb3JlaWduKSkgKwogICAgIGxhYnModGl0bGUgPSAicG9pbnQgY2hhbmdlIGluIExDU0EgbWlncmF0aW9uIiwKICAgICAgICAgIHN1YnRpdGxlID0gIiBMQ1NBIGZvcmVpZ24gaW1taWdyYXRpb24iLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCiAgIApgYGB7cn0KQ1NBY2hhbmdlMTRmb3IKYGBgCgpgYGB7cn0KQ1NBY2hhbmdlMTlmb3IKYGBgCgpgYGB7cn0KQ1NBcG9pbnRDaGFuZ2Vmb3IKYGBgCgpgYGB7cn0KQ1NBY2hhbmdlM2ZvcgpgYGAKCiMjIEJyZWFraW5nIGRvd24gdGhlIHJlc2VhcmNoIHNvIGZhci4uLgoKYGBge3J9CkxhbmNhc3Rlcl9PbWFoYV9leGFtcGxlIDwtIGNvdW50aWVzU0hQOCAlPiUgZmlsdGVyKHN0cl9kZXRlY3QoTkFNRUxTQUQsICJMaW5jb2xuLUJlYXRyaWNlLCBORSBDU0EiKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2RldGVjdChOQU1FTFNBRCwgIk9tYWhhLUNvdW5jaWwgQmx1ZmZzLUZyZW1vbnQsIE5FLUlBIENTQSIpKQoKTGFuY2FzdGVyX09tYWhhX0xDU0FfZXhhbXBsZTMgPC0gQ1NBc2hwMyAlPiUgZmlsdGVyKHN0cl9kZXRlY3QoTkFNRUxTQUQsICJMaW5jb2xuLUJlYXRyaWNlLCBORSBDU0EiKSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KE5BTUVMU0FELCAiT21haGEtQ291bmNpbCBCbHVmZnMtRnJlbW9udCwgTkUtSUEgQ1NBIikpCgpMYW5jYXN0ZXJMQ1NBX3RhYmxlIDwtIExDU0FfMTcgJT4lIGZpbHRlcihzdHJfZGV0ZWN0KE5BTUVMU0FELCAiTGluY29sbi1CZWF0cmljZSwgTkUgQ1NBIikgfAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfZGV0ZWN0KE5BTUVMU0FELCAiT21haGEtQ291bmNpbCBCbHVmZnMtRnJlbW9udCwgTkUtSUEgQ1NBIikpCmBgYAoKYGBge3J9CmV4YW0gPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfZXhhbXBsZSwgYWVzKGZpbGwgPSBQb2ludENoYW5nZUZpcnN0KSkgKwogICAgIGxhYnModGl0bGUgPSAnUG9pbnRDaGFuZ2VGaXJzdCcsCiAgICAgICAgICBzdWJ0aXRsZSA9ICJwZXJjZW50YWdlIHBvaW50IGNoYW5nZSBpbiBob3VzaW5nIGNvc3Qgb3ZlciBpbmNvbWUiLAogICAgICAgICAgY2FwdGlvbiA9ICJDb3N0Rmlyc3RfMjAxOS1Db3N0Rmlyc3RfMjAxNCIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIGdlb21fc2YoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gMywgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC45NzUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gTkEpKQpgYGAKCmBgYHtyfQpleGFtCmBgYAoKYGBge3J9CmV4YW0yIDwtIGdncGxvdChkYXRhID0gTGFuY2FzdGVyX09tYWhhX2V4YW1wbGUsIGFlcyhmaWxsID0gQ29zdEZpcnN0XzIwMTkpKSArCiAgICAgbGFicyh0aXRsZSA9ICdDb3N0Rmlyc3RfMjAxOScsCiAgICAgICAgICBzdWJ0aXRsZSA9ICJzdW0oKGhvdXNlaG9sZF90eXBlKHMpL2FsbF9vY2N1cGllZF91bml0cykqaG91c2Vob2xkX3R5cGVfY29zdChzKSkiLAogICAgICAgICAgY2FwdGlvbiA9ICJyZW50ZXIsIG1vcnRnYWdvciBhbmQgb3duZXIgd2VpZ2h0cyBzdW0gdG8gMSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIGdlb21fc2YoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gMywgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMzApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguOTc1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9IE5BKSkKYGBgCgpgYGB7cn0KZXhhbTIKYGBgCgpgYGB7cn0KZXhhbTMgPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgYWVzKGZpbGwgPSBDU0Fwb2ludENoYW5nZUZpcnN0KSkgKwogIGxhYnModGl0bGUgPSAnQ1NBcG9pbnRDaGFuZ2VGaXJzdCcsCiAgICAgICAgICBzdWJ0aXRsZSA9ICJwZXJjZW50YWdlIHBvaW50IGNoYW5nZSBpbiBob3VzaW5nIGNvc3Qgb3ZlciBpbmNvbWUiLAogICAgICAgICAgY2FwdGlvbiA9ICJDU0Fjb3N0Rmlyc3RfMjAxOS1DU0Fjb3N0Rmlyc3RfMjAxNCIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIGdlb21fc2YoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gMywgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC45NzUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gTkEpKQpgYGAKCmBgYHtyfQpleGFtMwpgYGAKCmBgYHtyfQpleGFtNCA8LSBnZ3Bsb3QoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBhZXMoZmlsbCA9IENTQWNvc3RGaXJzdF8yMDE5KSkgKwogIGxhYnModGl0bGUgPSAnQ1NBY29zdEZpcnN0XzIwMTknLAogICAgICAgc3VidGl0bGUgPSAic3VtKChjb3VudGllc190eXBlKHMpL0xDU0FzX3VuaXRzKSpjb3VudGllc190eXBlX2Nvc3QocykpIiwKICAgICAgIGNhcHRpb24gPSAiY291bml0ZXMnIExDU0Etb2NjdXBpZWQtdW5pdHMtbm9ybWFsaXplZCByZXNpZGVudChzKSB3ZWlnaHRzIHN1bSB0byAxIikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgZ2VvbV9zZihkYXRhID0gTGFuY2FzdGVyX09tYWhhX0xDU0FfZXhhbXBsZTMsIGZpbGwgPSBOQSwgY29sb3IgPSAicmVkIikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSAzLCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAzMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC45NzUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gTkEpKQpgYGAKCmBgYHtyfQpleGFtNApgYGAKCmBgYHtyfQpleGFtNSA8LSBnZ3Bsb3QoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9leGFtcGxlLCBhZXMoZmlsbCA9IFN0YXJ0ZXJSYXRpb1BQY2hhbmdlKSkgKwogICAgIGxhYnModGl0bGUgPSAnU3RhcnRlclJhdGlvUFBjaGFuZ2UnLAogICAgICAgICAgc3VidGl0bGUgPSAicG9pbnQgY2hhbmdlIGluIG5ldyBzaW5nbGUtZmFtaWx5IHVuaXQgcGVybWl0cyBvdmVyIHRvdGFsIDIwMTkgdW5pdHMiLAogICAgICAgICAgY2FwdGlvbiA9ICIoc3VtKHNpbmdsZXNfMTVfMTkpL1RvdGFsXzE5KS0oc3VtKHNpbmdsZXNfMTBfMTQpL1RvdGFsXzE5KSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIGdlb21fc2YoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gMywgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC45NzUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gTkEpKQpgYGAKCmBgYHtyfQpleGFtNQpgYGAKCmBgYHtyfQpleGFtNTUgPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfZXhhbXBsZSwgYWVzKGZpbGwgPSBTdGFydGVyUmF0aW9EZWNhZGUpKSArCiAgICAgbGFicyh0aXRsZSA9ICdTdGFydGVyUmF0aW9EZWNhZGUnLAogICAgICAgICAgc3VidGl0bGUgPSAicGVyY2VudGFnZSBvZiB0b3RhbCB1bml0cyBmcm9tIG5ldyBzaW5nbGUtZmFtaWx5IHVuaXQgcGVybWl0cyIsCiAgICAgICAgICBjYXB0aW9uID0gIjEwMCooTmV3U3RhcnRlcnNfMjAxNCtOZXdTdGFydGVyc18yMDE5KS9Vbml0c18yMDE5KSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIGdlb21fc2YoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gMywgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC45NzUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gTkEpKQpgYGAKCmBgYHtyfQpleGFtNTUKYGBgCgpgYGB7cn0KZXhhbTYgPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgYWVzKGZpbGwgPSBDU0FzdGFydGVyUmF0aW9QUGNoYW5nZSkpICsKICBsYWJzKHRpdGxlID0gJ0NTQXN0YXJ0ZXJSYXRpb1BQY2hhbmdlJywKICAgICAgIHN1YnRpdGxlID0gInN1bSgoY291bnR5VW5pdHMvQ1NBdW5pdHMpKlN0YXJ0ZXJSYXRpb1BQY2hhbmdlKSIsCiAgICAgICBjYXB0aW9uID0gImNvdW5pdGVzJyBMQ1NBLXVuaXRzLW5vcm1hbGl6ZWQgcG9pbnQtY2hhbmdlIHdlaWdodHMgc3VtIHRvIDEiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICBnZW9tX3NmKGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgZmlsbCA9IE5BLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDMsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguOTc1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9IE5BKSkKYGBgCgpgYGB7cn0KZXhhbTYKYGBgCgpgYGB7cn0KZXhhbTY2IDwtIGdncGxvdChkYXRhID0gTGFuY2FzdGVyX09tYWhhX0xDU0FfZXhhbXBsZTMsIGFlcyhmaWxsID0gQ1NBc3RhcnRlclJhdGlvRGVjYWRlKSkgKwogIGxhYnModGl0bGUgPSAnQ1NBc3RhcnRlclJhdGlvRGVjYWRlJywKICAgICAgIHN1YnRpdGxlID0gInN1bShDU0F1bml0c092ZXJUb3RhbFVuaXRzXzIwMTkqU3RhcnRlclJhdGlvRGVjYWRlKSwgYnkgTENTQSIsCiAgICAgICBjYXB0aW9uID0gIkxDU0EtdW5pdHMtbm9ybWFsaXplZCByYXRpbyBkZWNhZGUgd2VpZ2h0cyBzdW0gdG8gMSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIGdlb21fc2YoZGF0YSA9IExhbmNhc3Rlcl9PbWFoYV9MQ1NBX2V4YW1wbGUzLCBmaWxsID0gTkEsIGNvbG9yID0gInJlZCIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gMywgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC45NzUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gTkEpKQpgYGAKCmBgYHtyfQpleGFtNjYKYGBgCgpgYGB7cn0KZXhhbTcgPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfZXhhbXBsZSwgYWVzKGZpbGwgPSBwb2ludGNvbnRyaWJ1dGlvbkZyb21JbnRlcm5hbCkpICsKICAgICBsYWJzKHRpdGxlID0gJ3BvaW50Y29udHJpYnV0aW9uRnJvbUludGVybmFsJywKICAgICAgICAgIHN1YnRpdGxlID0gInBvaW50IGNvbnRyaWJ1dGlvbiB0byAyMDE5IGNvdW50eSBwb3AgZnJvbSBORVQgSU50ZXJuYWwgTENTQSBtaWdyYXRpb24iLAogICAgICAgICAgY2FwdGlvbiA9ICIoKHN1bShpbnRyYUxDU0FuZXRJTTE0KStzdW0oaW50cmFMQ1NBbmV0SU0xOSkpL2NvdW50eVBvcDE5KSoxMDAiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICBnZW9tX3NmKGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgZmlsbCA9IE5BLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDMsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguOTc1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9IE5BKSkKYGBgCgpgYGB7cn0KZXhhbTcKYGBgCgpgYGB7cn0KZXhhbTggPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfZXhhbXBsZSwgYWVzKGZpbGwgPSBwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbCkpICsKICAgICBsYWJzKHRpdGxlID0gJ3BvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsJywKICAgICAgICAgIHN1YnRpdGxlID0gInBvaW50IGNvbnRyaWJ1dGlvbiB0byAyMDE5IGNvdW50eSBwb3AgZnJvbSBORVQgRVh0ZXJuYWwgTENTQSBtaWdyYXRpb24iLAogICAgICAgICAgY2FwdGlvbiA9ICIoKHN1bShleHRlckxDU0FuZXRJTTE0KStzdW0oZXh0ZXJMQ1NBbmV0SU0xOSkpL2NvdW50eVBvcDE5KSoxMDAiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICBnZW9tX3NmKGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgZmlsbCA9IE5BLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDMsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguOTc1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9IE5BKSkKYGBgCgpgYGB7cn0KZXhhbTgKYGBgCgpgYGB7cn0KZXhhbTkgPC0gZ2dwbG90KGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgYWVzKGZpbGwgPSBDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbCkpICsKICBsYWJzKHRpdGxlID0gJ0NTQXBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsJywKICAgICAgIHN1YnRpdGxlID0gInN1bSgoTENTQWV4dGVyQ291bnR5TkVUMTkrTENTQWV4dGVyQ291bnR5TkVUMTQpKSwgYnkgTENTQSIsCiAgICAgICBjYXB0aW9uID0gImRhdGFmcmFtZSBtZXJnZWQgYXJyaXZhbHMgYW5kIGRlcGFydHVyZXMgdG8gcHJlc2VydmUgTkVUIGRvbWVzdGljIG1pZ3JhbnQgZmxvd3MiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICBnZW9tX3NmKGRhdGEgPSBMYW5jYXN0ZXJfT21haGFfTENTQV9leGFtcGxlMywgZmlsbCA9IE5BLCBjb2xvciA9ICJyZWQiKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDMsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguOTc1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9IE5BKSkKYGBgCgpgYGB7cn0KZXhhbTkKYGBgCgojI0JyaW5naW5nIGluIHRoZSBnZW9kZW1vZ3JhcGhpY3MKCmBgYHtyfQpkZW1vQ29udHJvbCA8LSByZWFkX2NzdigiZGVtb0NvbnRyb2wuY3N2IikKCmRlbW9Db250cm9sMiA8LSBkZW1vQ29udHJvbCAlPiUKICBwaXZvdF93aWRlciguLCBpZF9jb2xzID0gYygieWVhciIsICJHRU9JRCIpLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB2YXJpYWJsZSwKICAgICAgICAgICAgICB2YWx1ZXNfZnJvbSA9IGMoImVzdGltYXRlIiwgIm1vZSIpKQoKZGVtb0NvbnRyb2wzIDwtIGRlbW9Db250cm9sMiAlPiUKICBtdXRhdGUoaGlzcF9wcmltZV9tYWxlID0gZXN0aW1hdGVfQjAxMDAxSV8wMDkgKyBlc3RpbWF0ZV9CMDEwMDFJXzAxMCArIGVzdGltYXRlX0IwMTAwMUlfMDExICsgZXN0aW1hdGVfQjAxMDAxSV8wMTIpICU+JSAKICBtdXRhdGUocHJpbWVfbWFsZSA9IGVzdGltYXRlX0IwMTAwMV8wMTEgKyBlc3RpbWF0ZV9CMDEwMDFfMDEyICsgZXN0aW1hdGVfQjAxMDAxXzAxMyArIGVzdGltYXRlX0IwMTAwMV8wMTQgKyBlc3RpbWF0ZV9CMDEwMDFfMDE1ICsgZXN0aW1hdGVfQjAxMDAxXzAxNikgJT4lIAogIG11dGF0ZShoaXNwTWFsZTI1XzU0b3Zlck1hbGUyNV81NCA9IChoaXNwX3ByaW1lX21hbGUvcHJpbWVfbWFsZSkqMTAwKSAlPiUgCiAgbXV0YXRlKHBvc3RVTkRFUmdyYWRfZmVtYWxlXzIyXzI5ID0gZXN0aW1hdGVfQjAxMDAxXzAzNCArIGVzdGltYXRlX0IwMTAwMV8wMzUpICU+JSAKICBtdXRhdGUoZmVydGlsZUZFbWFsZV8xNV80OSA9IGVzdGltYXRlX0IwMTAwMV8wMzAgKyBlc3RpbWF0ZV9CMDEwMDFfMDMxICsgZXN0aW1hdGVfQjAxMDAxXzAzMiArIGVzdGltYXRlX0IwMTAwMV8wMzMgKyBlc3RpbWF0ZV9CMDEwMDFfMDM0ICsgZXN0aW1hdGVfQjAxMDAxXzAzNSArCiAgICAgICAgIGVzdGltYXRlX0IwMTAwMV8wMzYgKyBlc3RpbWF0ZV9CMDEwMDFfMDM3ICsgZXN0aW1hdGVfQjAxMDAxXzAzOCArIGVzdGltYXRlX0IwMTAwMV8wMzkpICU+JSAKICBtdXRhdGUoZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDkgPSAocG9zdFVOREVSZ3JhZF9mZW1hbGVfMjJfMjkvZmVydGlsZUZFbWFsZV8xNV80OSkqMTAwKSAlPiUgCiAgbXV0YXRlKHdoaXRlTUFMRVNfNDVfNTQgPSBlc3RpbWF0ZV9CMDEwMDFBXzAxMikgJT4lIAogIG11dGF0ZShNQUxFU180NV81NCA9IGVzdGltYXRlX0IwMTAwMV8wMTUgKyBlc3RpbWF0ZV9CMDEwMDFfMDE2KSAlPiUKICBtdXRhdGUod2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0ID0gKHdoaXRlTUFMRVNfNDVfNTQvTUFMRVNfNDVfNTQpKjEwMCkgJT4lCiAgbXV0YXRlKGJsYWNrMF8xNyA9IGVzdGltYXRlX0IwMTAwMUJfMDAzICsgZXN0aW1hdGVfQjAxMDAxQl8wMDQgKyBlc3RpbWF0ZV9CMDEwMDFCXzAwNSArIGVzdGltYXRlX0IwMTAwMUJfMDA2ICsgZXN0aW1hdGVfQjAxMDAxQl8wMTggKwogICAgICAgICBlc3RpbWF0ZV9CMDEwMDFCXzAxOSArIGVzdGltYXRlX0IwMTAwMUJfMDIwICsgZXN0aW1hdGVfQjAxMDAxQl8wMjEpICU+JSAKICBtdXRhdGUoYXNpYW4wXzE3ID0gZXN0aW1hdGVfQjAxMDAxRF8wMDMgKyBlc3RpbWF0ZV9CMDEwMDFEXzAwNCArIGVzdGltYXRlX0IwMTAwMURfMDA1ICsgZXN0aW1hdGVfQjAxMDAxRF8wMDYgKyBlc3RpbWF0ZV9CMDEwMDFEXzAxOCArCiAgICAgICAgIGVzdGltYXRlX0IwMTAwMURfMDE5ICsgZXN0aW1hdGVfQjAxMDAxRF8wMjAgKyBlc3RpbWF0ZV9CMDEwMDFEXzAyMSkgJT4lIAogIG11dGF0ZSh5b3V0aDBfMTcgPSBlc3RpbWF0ZV9CMDEwMDFfMDAzICsgZXN0aW1hdGVfQjAxMDAxXzAwNCArIGVzdGltYXRlX0IwMTAwMV8wMDUgKyBlc3RpbWF0ZV9CMDEwMDFfMDA2ICsgZXN0aW1hdGVfQjAxMDAxXzAyNyArCiAgICAgICAgIGVzdGltYXRlX0IwMTAwMV8wMjggKyBlc3RpbWF0ZV9CMDEwMDFfMDI5ICsgZXN0aW1hdGVfQjAxMDAxXzAzMCkgJT4lIAogIG11dGF0ZShibGFjazBfMTdvdmVyMF8xNyA9IChibGFjazBfMTcveW91dGgwXzE3KSoxMDApICU+JSAKICBtdXRhdGUoYXNpYW4wXzE3b3ZlcjBfMTcgPSAoYXNpYW4wXzE3L3lvdXRoMF8xNykqMTAwKSAlPiUgCiAgbXV0YXRlKHBvcDY1cGx1c09WRVJwb3AgPSAoKGVzdGltYXRlX0IwMTAwMV8wMjAgKyBlc3RpbWF0ZV9CMDEwMDFfMDIxICsgZXN0aW1hdGVfQjAxMDAxXzAyMiArIGVzdGltYXRlX0IwMTAwMV8wMjMgKyBlc3RpbWF0ZV9CMDEwMDFfMDI0ICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXN0aW1hdGVfQjAxMDAxXzAyNSArIGVzdGltYXRlX0IwMTAwMV8wNDQgKyBlc3RpbWF0ZV9CMDEwMDFfMDQ1ICsgZXN0aW1hdGVfQjAxMDAxXzA0NiArIGVzdGltYXRlX0IwMTAwMV8wNDcgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZV9CMDEwMDFfMDQ4ICsgZXN0aW1hdGVfQjAxMDAxXzA0OSkvIGVzdGltYXRlX0IwMTAwMV8wMDEpKjEwMCkgJT4lIAogIG11dGF0ZShPQ0NVUElFRHJvb21zID0gZXN0aW1hdGVfQjI1MDE0XzAwMSkgJT4lIAogIG11dGF0ZShyb29tc1dJVEhvbmVPUmxlc3MgPSBlc3RpbWF0ZV9CMjUwMTRfMDAzICsgZXN0aW1hdGVfQjI1MDE0XzAwNCArIGVzdGltYXRlX0IyNTAxNF8wMDkgKyBlc3RpbWF0ZV9CMjUwMTRfMDEwKSAlPiUgCiAgbXV0YXRlKHJvb21zV0lUSG1vcmVUSEFOb25lID0gZXN0aW1hdGVfQjI1MDE0XzAwNSArIGVzdGltYXRlX0IyNTAxNF8wMDYgKyBlc3RpbWF0ZV9CMjUwMTRfMDA3ICsKICAgICAgICAgZXN0aW1hdGVfQjI1MDE0XzAxMSArIGVzdGltYXRlX0IyNTAxNF8wMTIgKyBlc3RpbWF0ZV9CMjUwMTRfMDEzKQojTU9FcyBhcmUgaW4gZGVtb0NvbnRyb2wyCmRlbW9Db250cm9sNCA8LSBkZW1vQ29udHJvbDMgJT4lIAogIHNlbGVjdCh5ZWFyLCBHRU9JRCwgaGlzcE1hbGUyNV81NG92ZXJNYWxlMjVfNTQsIGZlbWFsZTIyXzI5b3ZlckZlbWFsZTE1XzQ5LCB3aGl0ZU1BTEU0NV81NG92ZXJNQUxFNDVfNTQsIGJsYWNrMF8xN292ZXIwXzE3LAogICAgICAgICBhc2lhbjBfMTdvdmVyMF8xNywgcG9wNjVwbHVzT1ZFUnBvcCwgT0NDVVBJRURyb29tcywgcm9vbXNXSVRIbW9yZVRIQU5vbmUsIHByaW1lX21hbGUsIGZlcnRpbGVGRW1hbGVfMTVfNDksIE1BTEVTXzQ1XzU0LAogICAgICAgICB5b3V0aDBfMTcsIHBvcCA9IGVzdGltYXRlX0IwMTAwMV8wMDEpICU+JSAKICAgIHBpdm90X3dpZGVyKC4sIGlkX2NvbHMgPSBjKCJHRU9JRCIpLAogICAgICAgICAgICAgIG5hbWVzX2Zyb20gPSB5ZWFyLAogICAgICAgICAgICAgIHZhbHVlc19mcm9tID0gYygiaGlzcE1hbGUyNV81NG92ZXJNYWxlMjVfNTQiLCAiZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDkiLCAid2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJsYWNrMF8xN292ZXIwXzE3IiwgImFzaWFuMF8xN292ZXIwXzE3IiwgInBvcDY1cGx1c09WRVJwb3AiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT0NDVVBJRURyb29tcyIsICJyb29tc1dJVEhtb3JlVEhBTm9uZSIsICJwcmltZV9tYWxlIiwgImZlcnRpbGVGRW1hbGVfMTVfNDkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTUFMRVNfNDVfNTQiLCAicG9wIiwgInlvdXRoMF8xNyIpKSAlPiUgCiAgbXV0YXRlKHBvaW50Q0hBTkdFaGlzcFBSSU1FbWFsZSA9IGhpc3BNYWxlMjVfNTRvdmVyTWFsZTI1XzU0XzIwMTkgLSBoaXNwTWFsZTI1XzU0b3Zlck1hbGUyNV81NF8yMDE0KSAlPiUgCiAgbXV0YXRlKHBvaW50Q0hBTkdFcG9zdEdSQURmZXJ0UFJFViA9IGZlbWFsZTIyXzI5b3ZlckZlbWFsZTE1XzQ5XzIwMTkgLSBmZW1hbGUyMl8yOW92ZXJGZW1hbGUxNV80OV8yMDE0KSAlPiUgCiAgbXV0YXRlKHBvaW50Q0hBTkdFcGVha1dIVG1hbGVFQVJORVJTcHJldiA9IHdoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE5IC0gd2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0XzIwMTQpICU+JSAKICBtdXRhdGUocG9pbnRDSEFOR0VibGFja1lPVVRIcHJldiA9IGJsYWNrMF8xN292ZXIwXzE3XzIwMTkgLSBibGFjazBfMTdvdmVyMF8xN18yMDE0KSAlPiUgCiAgbXV0YXRlKHBvaW50Q0hBTkdFYXNpYW5ZT1VUSHByZXYgPSBhc2lhbjBfMTdvdmVyMF8xN18yMDE5IC0gYXNpYW4wXzE3b3ZlcjBfMTdfMjAxNCkgJT4lIAogIG11dGF0ZShwb2ludENIQU5HRXJldGlyZWVQUkVWID0gcG9wNjVwbHVzT1ZFUnBvcF8yMDE5IC0gcG9wNjVwbHVzT1ZFUnBvcF8yMDE0KSAlPiUgCiAgbXV0YXRlKE9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTkgPSAocm9vbXNXSVRIbW9yZVRIQU5vbmVfMjAxOS9PQ0NVUElFRHJvb21zXzIwMTkpKjEwMCkgJT4lIAogIG11dGF0ZShPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE0ID0gKHJvb21zV0lUSG1vcmVUSEFOb25lXzIwMTQvT0NDVVBJRURyb29tc18yMDE0KSoxMDApICU+JSAKICBtdXRhdGUocG9pbnRDSE5Hb2NjUk1tb3JlVEhBTm9uZSA9IE9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTkgLSBPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE0KQpgYGAKCiMjSm9pbmluZyBkYXRhZnJhbWVzCgpgYGB7cn0KZGVuc2l0eSA8LSBTSFAyICU+JQogIHN0X3NldF9nZW9tZXRyeSguLCBOVUxMKSAlPiUKICBzZWxlY3QoLVNUQVRFRlAsIC1DT1VOVFlGUCwgLUNPVU5UWU5TLCAtQUZGR0VPSUQsIC1OQU1FLCAtTFNBRCwgLUFXQVRFUikKCnBvcERFTiA8LSBwb3BweSAlPiUgc2VsZWN0KEdFT0lELCBUb3RhbFBvcF8yMDE0LCBUb3RhbFBvcF8yMDE5KQogIApkZW5zaXR5MiA8LSBkZW5zaXR5ICU+JSBmdWxsX2pvaW4oLiwgcG9wREVOLCBieSA9IGMoIkdFT0lEIikpCgpkZW5zaXR5MiA8LSBkZW5zaXR5MiAlPiUgCiAgbXV0YXRlKGRlbnNpdHlfMjAxNCA9IFRvdGFsUG9wXzIwMTQvQUxBTkQpICU+JSAKICBtdXRhdGUoZGVuc2l0eV8yMDE5ID0gVG90YWxQb3BfMjAxOS9BTEFORCkgJT4lIAogIG11dGF0ZShkZW5zaXR5UG9pbnRDaGFuZ2UgPSBkZW5zaXR5XzIwMTkgLSBkZW5zaXR5XzIwMTQpICU+JSAKICBzZWxlY3QoLVRvdGFsUG9wXzIwMTQsIC1Ub3RhbFBvcF8yMDE5KQoKTENTQV8xNyA8LSBMQ1NBXzE3ICU+JSBmdWxsX2pvaW4oLiwgZGVuc2l0eTIsIGJ5ID0gYygiR0VPSUQiKSkgJT4lIAogIG11dGF0ZShjc2FBTEFORCA9IHN1bShBTEFORCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkKCkxDU0FfMTcgPC0gTENTQV8xNyAlPiUgCiAgbXV0YXRlKGNzYURFTlNJVFlfMjAxNCA9IENTQXBvcFRvdGFsXzIwMTQvY3NhQUxBTkQpICU+JSAKICBtdXRhdGUoY3NhREVOU0lUWV8yMDE5ID0gQ1NBcG9wVG90YWxfMjAxOS9jc2FBTEFORCkKCkxDU0FfMTcgPC0gTENTQV8xNyAlPiUgCiAgbXV0YXRlKHBvaW50Q0hBTkdFY3NhREVOU0lUWSA9IGNzYURFTlNJVFlfMjAxOSAtIGNzYURFTlNJVFlfMjAxNCkKCkxDU0FfMTggPC0gTENTQV8xNyAlPiUgZnVsbF9qb2luKC4sIGRlbW9Db250cm9sNCwgYnkgPSBjKCJHRU9JRCIpKQoKTENTQV8xOCA8LSBMQ1NBXzE4ICU+JQogIHNlbGVjdChHRU9JRCwgTkFNRSwKICAgICAgICAgQ29zdEZpcnN0XzIwMTQsIFBvaW50Q2hhbmdlRmlyc3QsIENvc3RGaXJzdF8yMDE5LAogICAgICAgICBTdGFydGVyT3ZlclRvdFBQXzIwMTQsIFN0YXJ0ZXJSYXRpb1BQY2hhbmdlLCBTdGFydGVyT3ZlclRvdFBQXzIwMTksIFN0YXJ0ZXJSYXRpb0RlY2FkZSwKICAgICAgICAgcG9pbnRGcm9tSW50ZXJuYWxfMjAxNCwgcG9pbnRDaGFuZ2VJbnRlcm5hbCxwb2ludEZyb21JbnRlcm5hbF8yMDE5LCBwb2ludGNvbnRyaWJ1dGlvbkZyb21JbnRlcm5hbCwKICAgICAgICAgcG9pbnRGcm9tRXh0ZXJuYWxfMjAxNCwgcG9pbnRDaGFuZ2VFeHRlcm5hbCwgcG9pbnRGcm9tRXh0ZXJuYWxfMjAxOSwgcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWwsCiAgICAgICAgIHBvaW50RnJvbUZvcmVpZ25fMjAxNCwgcG9pbnRDaGFuZ2VGb3JlaWduLCBwb2ludEZyb21Gb3JlaWduXzIwMTksIHBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ24sCiAgICAgICAgIGhpc3BNYWxlMjVfNTRvdmVyTWFsZTI1XzU0XzIwMTQsIHBvaW50Q0hBTkdFaGlzcFBSSU1FbWFsZSwgaGlzcE1hbGUyNV81NG92ZXJNYWxlMjVfNTRfMjAxOSwKICAgICAgICAgZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDlfMjAxNCwgcG9pbnRDSEFOR0Vwb3N0R1JBRGZlcnRQUkVWLCBmZW1hbGUyMl8yOW92ZXJGZW1hbGUxNV80OV8yMDE5LAogICAgICAgICB3aGl0ZU1BTEU0NV81NG92ZXJNQUxFNDVfNTRfMjAxNCwgcG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2LCB3aGl0ZU1BTEU0NV81NG92ZXJNQUxFNDVfNTRfMjAxOSwKICAgICAgICAgYmxhY2swXzE3b3ZlcjBfMTdfMjAxNCwgcG9pbnRDSEFOR0VibGFja1lPVVRIcHJldiwgYmxhY2swXzE3b3ZlcjBfMTdfMjAxOSwKICAgICAgICAgYXNpYW4wXzE3b3ZlcjBfMTdfMjAxNCwgcG9pbnRDSEFOR0Vhc2lhbllPVVRIcHJldiwgYXNpYW4wXzE3b3ZlcjBfMTdfMjAxOSwKICAgICAgICAgcG9wNjVwbHVzT1ZFUnBvcF8yMDE0LCBwb2ludENIQU5HRXJldGlyZWVQUkVWLCBwb3A2NXBsdXNPVkVScG9wXzIwMTksCiAgICAgICAgIE9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTQsIHBvaW50Q0hOR29jY1JNbW9yZVRIQU5vbmUsIE9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTksCiAgICAgICAgIE9DQ1VQSUVEcm9vbXNfMjAxNCwgT0NDVVBJRURyb29tc18yMDE5LAogICAgICAgICBkZW5zaXR5XzIwMTQsIGRlbnNpdHlQb2ludENoYW5nZSwgZGVuc2l0eV8yMDE5LAogICAgICAgICBwcmltZV9tYWxlXzIwMTQsIHByaW1lX21hbGVfMjAxOSwKICAgICAgICAgZmVydGlsZUZFbWFsZV8xNV80OV8yMDE0LCBmZXJ0aWxlRkVtYWxlXzE1XzQ5XzIwMTksCiAgICAgICAgIE1BTEVTXzQ1XzU0XzIwMTQsIE1BTEVTXzQ1XzU0XzIwMTksCiAgICAgICAgIHBvcF8yMDE0LCBwb3BfMjAxOSwKICAgICAgICAgeW91dGgwXzE3XzIwMTQsIHlvdXRoMF8xN18yMDE5LAogICAgICAgICBOQU1FTFNBRCwgZ3JvdXAsIGRvX3VuaW9uLAogICAgICAgICBDU0Fjb3N0Rmlyc3RfMjAxNCwgQ1NBcG9pbnRDaGFuZ2VGaXJzdCwgQ1NBY29zdEZpcnN0XzIwMTksCiAgICAgICAgIENTQXN0YXJ0ZXJPdmVyVG90UFBfMjAxNCwgQ1NBc3RhcnRlclJhdGlvUFBjaGFuZ2UsIENTQXN0YXJ0ZXJPdmVyVG90UFBfMjAxOSwgQ1NBc3RhcnRlclJhdGlvRGVjYWRlLAogICAgICAgICBDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbF8xNCwgQ1NBcG9pbnRDaGFuZ2VFeHRlcm5hbCwgQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWxfMTksIENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsLAogICAgICAgICBDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduXzE0LCBDU0Fwb2ludENoYW5nZUZvcmVpZ24sIENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ25fMTksIENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ24sCiAgICAgICAgIGNzYURFTlNJVFlfMjAxNCwgcG9pbnRDSEFOR0Vjc2FERU5TSVRZLCBjc2FERU5TSVRZXzIwMTkpICU+JSAKICBtdXRhdGUoY3NhUFJJTUVtYWxlXzE0ID0gc3VtKHByaW1lX21hbGVfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FISVNQbWFsZVBSSU1FcHJldl8xNCA9IHN1bSgocHJpbWVfbWFsZV8yMDE0L2NzYVBSSU1FbWFsZV8xNCkqaGlzcE1hbGUyNV81NG92ZXJNYWxlMjVfNTRfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FQUklNRW1hbGVfMTkgPSBzdW0ocHJpbWVfbWFsZV8yMDE5KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYUhJU1BtYWxlUFJJTUVwcmV2XzE5ID0gc3VtKChwcmltZV9tYWxlXzIwMTkvY3NhUFJJTUVtYWxlXzE5KSpoaXNwTWFsZTI1XzU0b3Zlck1hbGUyNV81NF8yMDE5KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYVBPSU5UY2hhbmdlSElTUHByZXYgPSBjc2FISVNQbWFsZVBSSU1FcHJldl8xOSAtIGNzYUhJU1BtYWxlUFJJTUVwcmV2XzE0KSAlPiUgCiAgbXV0YXRlKGNzYUZFUlRmZW1hbGVfMTQgPSBzdW0oZmVydGlsZUZFbWFsZV8xNV80OV8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYUZFUlRmZW1hbGVQUkVWXzE0ID0gc3VtKChmZXJ0aWxlRkVtYWxlXzE1XzQ5XzIwMTQvY3NhRkVSVGZlbWFsZV8xNCkqZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDlfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FGRVJUZmVtYWxlXzE5ID0gc3VtKGZlcnRpbGVGRW1hbGVfMTVfNDlfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FGRVJUZmVtYWxlUFJFVl8xOSA9IHN1bSgoZmVydGlsZUZFbWFsZV8xNV80OV8yMDE5L2NzYUZFUlRmZW1hbGVfMTkpKmZlbWFsZTIyXzI5b3ZlckZlbWFsZTE1XzQ5XzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhUE9JTlRjaGFuZ2VGRVJUZmVtYWxlID0gY3NhRkVSVGZlbWFsZVBSRVZfMTkgLSBjc2FGRVJUZmVtYWxlUFJFVl8xNCkgJT4lIAogIG11dGF0ZShjc2FQRUFLd2hpdGVNQUxFZWFybl8xNCA9IHN1bShNQUxFU180NV81NF8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYVdISVRFbWFsZUVBUk5fMTQgPSBzdW0oKE1BTEVTXzQ1XzU0XzIwMTQvY3NhUEVBS3doaXRlTUFMRWVhcm5fMTQpKndoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYVBFQUt3aGl0ZU1BTEVlYXJuXzE5ID0gc3VtKE1BTEVTXzQ1XzU0XzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhV0hJVEVtYWxlRUFSTl8xOSA9IHN1bSgoTUFMRVNfNDVfNTRfMjAxOS9jc2FQRUFLd2hpdGVNQUxFZWFybl8xOSkqd2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0XzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhUE9JTlRjaGFuZ2VXSElURW1hbGVFQVJOID0gY3NhV0hJVEVtYWxlRUFSTl8xOSAtIGNzYVdISVRFbWFsZUVBUk5fMTQpICU+JSAKICBtdXRhdGUoY3NhUE9QXzE0ID0gc3VtKHBvcF8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYTY1cGx1c1BSRVZfMTQgPSBzdW0oKHBvcF8yMDE0L2NzYVBPUF8xNCkqcG9wNjVwbHVzT1ZFUnBvcF8yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYVBPUF8xOSA9IHN1bShwb3BfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2E2NXBsdXNQUkVWXzE5ID0gc3VtKChwb3BfMjAxOS9jc2FQT1BfMTkpKnBvcDY1cGx1c09WRVJwb3BfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FQT0lOVGNoYW5nZTY1cGx1c1BSRVYgPSBjc2E2NXBsdXNQUkVWXzE5IC0gY3NhNjVwbHVzUFJFVl8xNCkgJT4lIAogIG11dGF0ZShjc2FZT1VUSF8xNCA9IHN1bSh5b3V0aDBfMTdfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FCTEFDS3lvdXRoUFJFVl8xNCA9IHN1bSgoeW91dGgwXzE3XzIwMTQvY3NhWU9VVEhfMTQpKmJsYWNrMF8xN292ZXIwXzE3XzIwMTQpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhWU9VVEhfMTkgPSBzdW0oeW91dGgwXzE3XzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhQkxBQ0t5b3V0aFBSRVZfMTkgPSBzdW0oKHlvdXRoMF8xN18yMDE5L2NzYVlPVVRIXzE5KSpibGFjazBfMTdvdmVyMF8xN18yMDE5KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYVBPSU5UY2hhbmdlQkxBQ0t5b3V0aFBSRVYgPSBjc2FCTEFDS3lvdXRoUFJFVl8xOSAtIGNzYUJMQUNLeW91dGhQUkVWXzE0KSAlPiUgCiAgbXV0YXRlKGNzYUFTSUFOeW91dGhQUkVWXzE0ID0gc3VtKCh5b3V0aDBfMTdfMjAxNC9jc2FZT1VUSF8xNCkqYXNpYW4wXzE3b3ZlcjBfMTdfMjAxNCksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FBU0lBTnlvdXRoUFJFVl8xOSA9IHN1bSgoeW91dGgwXzE3XzIwMTkvY3NhWU9VVEhfMTkpKmFzaWFuMF8xN292ZXIwXzE3XzIwMTkpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhUE9JTlRjaGFuZ2VBU0lBTnlvdXRoUFJFViA9IGNzYUFTSUFOeW91dGhQUkVWXzE5IC0gY3NhQVNJQU55b3V0aFBSRVZfMTQpICU+JSAKICBtdXRhdGUoY3NhT0NDcm9vbXNfMTQgPSBzdW0oT0NDVVBJRURyb29tc18yMDE0KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYU9DQ3Jvb21zXzE5ID0gc3VtKE9DQ1VQSUVEcm9vbXNfMjAxOSksCiAgICAgICAgIGRvX3VuaW9uID0gVFJVRSkgJT4lIAogIG11dGF0ZShjc2FPQ0NybU1PUkV0aGFuT05FXzE0ID0gc3VtKChPQ0NVUElFRHJvb21zXzIwMTQvY3NhT0NDcm9vbXNfMTQpKk9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTQpLAogICAgICAgICBkb191bmlvbiA9IFRSVUUpICU+JSAKICBtdXRhdGUoY3NhT0NDcm1NT1JFdGhhbk9ORV8xOSA9IHN1bSgoT0NDVVBJRURyb29tc18yMDE5L2NzYU9DQ3Jvb21zXzE5KSpPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE5KSwKICAgICAgICAgZG9fdW5pb24gPSBUUlVFKSAlPiUgCiAgbXV0YXRlKGNzYVBPSU5UY2hhbmdlT0NDcm1NT1JFdGhhbk9ORSA9IGNzYU9DQ3JtTU9SRXRoYW5PTkVfMTkgLSBjc2FPQ0NybU1PUkV0aGFuT05FXzE0KQoKY291bnRpZXNTSFAxMCA8LSBjb3VudGllc1NIUDYgJT4lIGZ1bGxfam9pbiguLCBMQ1NBXzE4LCBieSA9IGMoIkdFT0lEIikpCgpMQ1NBX1NIUDEwIDwtIGdlb19qb2luKFNIUDUsIExDU0FfMTgsIGJ5ID0gYygiZ3JvdXAiKSkKYGBgCgojI01ha2luZyBHRU9KU09OcwoKYGBge3J9Cmpzb25ueUNvdW5pdGVzIDwtIGNvdW50aWVzU0hQMTAgJT4lCiAgc2VsZWN0KEdFT0lELCBOQU1FLAogICAgICAgICBQb2ludENoYW5nZUZpcnN0LCBDb3N0Rmlyc3RfMjAxOSwKICAgICAgICAgU3RhcnRlclJhdGlvUFBjaGFuZ2UsIFN0YXJ0ZXJPdmVyVG90UFBfMjAxOSwgU3RhcnRlclJhdGlvRGVjYWRlLAogICAgICAgICBwb2ludENoYW5nZUludGVybmFsLCBwb2ludEZyb21JbnRlcm5hbF8yMDE5LCBwb2ludGNvbnRyaWJ1dGlvbkZyb21JbnRlcm5hbCwKICAgICAgICAgcG9pbnRDaGFuZ2VFeHRlcm5hbCwgcG9pbnRGcm9tRXh0ZXJuYWxfMjAxOSwgcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWwsCiAgICAgICAgIHBvaW50Q2hhbmdlRm9yZWlnbiwgcG9pbnRGcm9tRm9yZWlnbl8yMDE5LCBwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduLAogICAgICAgICBwb2ludENIQU5HRWhpc3BQUklNRW1hbGUsIGhpc3BNYWxlMjVfNTRvdmVyTWFsZTI1XzU0XzIwMTksCiAgICAgICAgIHBvaW50Q0hBTkdFcG9zdEdSQURmZXJ0UFJFViwgZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDlfMjAxOSwKICAgICAgICAgcG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2LCB3aGl0ZU1BTEU0NV81NG92ZXJNQUxFNDVfNTRfMjAxOSwKICAgICAgICAgcG9pbnRDSEFOR0VibGFja1lPVVRIcHJldiwgYmxhY2swXzE3b3ZlcjBfMTdfMjAxOSwKICAgICAgICAgcG9pbnRDSEFOR0Vhc2lhbllPVVRIcHJldiwgYXNpYW4wXzE3b3ZlcjBfMTdfMjAxOSwKICAgICAgICAgcG9pbnRDSEFOR0VyZXRpcmVlUFJFViwgcG9wNjVwbHVzT1ZFUnBvcF8yMDE5LAogICAgICAgICBwb2ludENITkdvY2NSTW1vcmVUSEFOb25lLCBPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE5LAogICAgICAgICBkZW5zaXR5XzIwMTQsIGRlbnNpdHlQb2ludENoYW5nZSwgZGVuc2l0eV8yMDE5LAogICAgICAgICBnZW9tZXRyeSkgJT4lIAogIGZpbHRlcihHRU9JRCAlaW4lIGN1dDIpICU+JQogIG11dGF0ZShQb2ludENoYW5nZUZpcnN0ID0gUG9pbnRDaGFuZ2VGaXJzdCkgJT4lIAogIG11dGF0ZShDb3N0Rmlyc3RfMjAxOSA9IENvc3RGaXJzdF8yMDE5KSAlPiUgCiAgbXV0YXRlKFN0YXJ0ZXJSYXRpb1BQY2hhbmdlID0gU3RhcnRlclJhdGlvUFBjaGFuZ2UpICU+JSAKICBtdXRhdGUoU3RhcnRlck92ZXJUb3RQUF8yMDE5ID0gU3RhcnRlck92ZXJUb3RQUF8yMDE5KSAlPiUgCiAgbXV0YXRlKFN0YXJ0ZXJSYXRpb0RlY2FkZSA9IFN0YXJ0ZXJSYXRpb0RlY2FkZSkgJT4lIAogIG11dGF0ZShwb2ludENoYW5nZUludGVybmFsID0gcG9pbnRDaGFuZ2VJbnRlcm5hbCkgJT4lIAogIG11dGF0ZShwb2ludEZyb21JbnRlcm5hbF8yMDE5ID0gcG9pbnRGcm9tSW50ZXJuYWxfMjAxOSkgJT4lIAogIG11dGF0ZShwb2ludGNvbnRyaWJ1dGlvbkZyb21JbnRlcm5hbCA9IHBvaW50Y29udHJpYnV0aW9uRnJvbUludGVybmFsKSAlPiUgCiAgbXV0YXRlKHBvaW50Q2hhbmdlRXh0ZXJuYWwgPSBwb2ludENoYW5nZUV4dGVybmFsKSAlPiUgCiAgbXV0YXRlKHBvaW50RnJvbUV4dGVybmFsXzIwMTkgPSBwb2ludEZyb21FeHRlcm5hbF8yMDE5KSAlPiUgCiAgbXV0YXRlKHBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsID0gcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWwpICU+JQogIG11dGF0ZShwb2ludENoYW5nZUZvcmVpZ24gPSBwb2ludENoYW5nZUZvcmVpZ24pICU+JQogIG11dGF0ZShwb2ludEZyb21Gb3JlaWduXzIwMTkgPSBwb2ludEZyb21Gb3JlaWduXzIwMTkpICU+JQogIG11dGF0ZShwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduID0gcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbikgJT4lCiAgbXV0YXRlKHBvaW50Q0hBTkdFaGlzcFBSSU1FbWFsZSA9IHBvaW50Q0hBTkdFaGlzcFBSSU1FbWFsZSkgJT4lIAogIG11dGF0ZShoaXNwTWFsZTI1XzU0b3Zlck1hbGUyNV81NF8yMDE5ID0gaGlzcE1hbGUyNV81NG92ZXJNYWxlMjVfNTRfMjAxOSkgJT4lIAogIG11dGF0ZShwb2ludENIQU5HRXBvc3RHUkFEZmVydFBSRVYgPSBwb2ludENIQU5HRXBvc3RHUkFEZmVydFBSRVYpICU+JSAKICBtdXRhdGUoZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDlfMjAxOSA9IGZlbWFsZTIyXzI5b3ZlckZlbWFsZTE1XzQ5XzIwMTkpICU+JSAKICBtdXRhdGUocG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2ID0gcG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2KSAlPiUgCiAgbXV0YXRlKHdoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE5ID0gd2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0XzIwMTkpICU+JSAKICBtdXRhdGUocG9pbnRDSEFOR0VibGFja1lPVVRIcHJldiA9IHBvaW50Q0hBTkdFYmxhY2tZT1VUSHByZXYpICU+JSAKICBtdXRhdGUoYmxhY2swXzE3b3ZlcjBfMTdfMjAxOSA9IGJsYWNrMF8xN292ZXIwXzE3XzIwMTkpICU+JSAKICBtdXRhdGUocG9pbnRDSEFOR0Vhc2lhbllPVVRIcHJldiA9IHBvaW50Q0hBTkdFYXNpYW5ZT1VUSHByZXYpICU+JSAKICBtdXRhdGUoYXNpYW4wXzE3b3ZlcjBfMTdfMjAxOSA9IGFzaWFuMF8xN292ZXIwXzE3XzIwMTkpICU+JSAKICBtdXRhdGUocG9pbnRDSEFOR0VyZXRpcmVlUFJFViA9IHBvaW50Q0hBTkdFcmV0aXJlZVBSRVYpICU+JSAKICBtdXRhdGUocG9wNjVwbHVzT1ZFUnBvcF8yMDE5ID0gcG9wNjVwbHVzT1ZFUnBvcF8yMDE5KSAlPiUgCiAgbXV0YXRlKHBvaW50Q0hOR29jY1JNbW9yZVRIQU5vbmUgPSBwb2ludENITkdvY2NSTW1vcmVUSEFOb25lKSAlPiUgCiAgbXV0YXRlKE9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTkgPSBPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE5KQoKI3NmOjpzdF93cml0ZShqc29ubnlDb3VuaXRlcywgZHNuID0gIi9Vc2Vycy9jd29vZHNvbjIvRGVza3RvcC9QaG9lbml4L2pzb25ueUNvdW5pdGVzLmdlb2pzb24iLAojICAgICAgICAgICAgIGxheWVyID0gImpzb25ueUNvdW5pdGVzLmdlb2pzb24iKQoKanNvbm55Q291bml0ZXMyIDwtIGpzb25ueUNvdW5pdGVzICU+JQogIHN0X3NldF9nZW9tZXRyeSguLCBOVUxMKSAlPiUKICBzZWxlY3QoLUdFT0lELCAtTkFNRSkKCmNvcnJ5IDwtIGNvcihqc29ubnlDb3VuaXRlczIpCgpqc29ubnlMQ1NBIDwtIExDU0FfU0hQMTAgJT4lIAogIHNlbGVjdChncm91cCwKICAgICAgICAgQ1NBcG9pbnRDaGFuZ2VGaXJzdCwgQ1NBY29zdEZpcnN0XzIwMTksCiAgICAgICAgIENTQXN0YXJ0ZXJSYXRpb1BQY2hhbmdlLCBDU0FzdGFydGVyT3ZlclRvdFBQXzIwMTksIENTQXN0YXJ0ZXJSYXRpb0RlY2FkZSwKICAgICAgICAgQ1NBcG9pbnRDaGFuZ2VFeHRlcm5hbCwgQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWxfMTksIENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsLAogICAgICAgICBDU0Fwb2ludENoYW5nZUZvcmVpZ24sIENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ25fMTksIENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ24sCiAgICAgICAgIGNzYVBPSU5UY2hhbmdlSElTUHByZXYsIGNzYUhJU1BtYWxlUFJJTUVwcmV2XzE5LAogICAgICAgICBjc2FQT0lOVGNoYW5nZUZFUlRmZW1hbGUsIGNzYUZFUlRmZW1hbGVQUkVWXzE5LAogICAgICAgICBjc2FQT0lOVGNoYW5nZVdISVRFbWFsZUVBUk4sIGNzYVdISVRFbWFsZUVBUk5fMTksCiAgICAgICAgIGNzYVBPSU5UY2hhbmdlNjVwbHVzUFJFViwgY3NhNjVwbHVzUFJFVl8xOSwKICAgICAgICAgY3NhUE9JTlRjaGFuZ2VCTEFDS3lvdXRoUFJFViwgY3NhQkxBQ0t5b3V0aFBSRVZfMTksCiAgICAgICAgIGNzYVBPSU5UY2hhbmdlQVNJQU55b3V0aFBSRVYsIGNzYUFTSUFOeW91dGhQUkVWXzE5LAogICAgICAgICBjc2FQT0lOVGNoYW5nZU9DQ3JtTU9SRXRoYW5PTkUsIGNzYU9DQ3JtTU9SRXRoYW5PTkVfMTksCiAgICAgICAgIGNzYURFTlNJVFlfMjAxNCwgcG9pbnRDSEFOR0Vjc2FERU5TSVRZLCBjc2FERU5TSVRZXzIwMTksKSAlPiUgCiAgbXV0YXRlKENTQXBvaW50Q2hhbmdlRmlyc3QgPSBDU0Fwb2ludENoYW5nZUZpcnN0KSAlPiUgCiAgbXV0YXRlKENTQWNvc3RGaXJzdF8yMDE5ID0gQ1NBY29zdEZpcnN0XzIwMTkpICU+JSAKICBtdXRhdGUoQ1NBc3RhcnRlclJhdGlvUFBjaGFuZ2UgPSBDU0FzdGFydGVyUmF0aW9QUGNoYW5nZSkgJT4lIAogIG11dGF0ZShDU0FzdGFydGVyT3ZlclRvdFBQXzIwMTkgPSBDU0FzdGFydGVyT3ZlclRvdFBQXzIwMTkpICU+JSAKICBtdXRhdGUoQ1NBc3RhcnRlclJhdGlvRGVjYWRlID0gQ1NBc3RhcnRlclJhdGlvRGVjYWRlKSAlPiUgCiAgbXV0YXRlKENTQXBvaW50Q2hhbmdlRXh0ZXJuYWwgPSBDU0Fwb2ludENoYW5nZUV4dGVybmFsKSAlPiUgCiAgbXV0YXRlKENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUV4dGVybmFsXzE5ID0gQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWxfMTkpICU+JSAKICBtdXRhdGUoQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRXh0ZXJuYWwgPSBDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21FeHRlcm5hbCkgJT4lCiAgbXV0YXRlKENTQXBvaW50Q2hhbmdlRm9yZWlnbiA9IENTQXBvaW50Q2hhbmdlRm9yZWlnbikgJT4lCiAgbXV0YXRlKENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ25fMTkgPSBDU0Fwb2ludGNvbnRyaWJ1dGlvbkZyb21Gb3JlaWduXzE5KSAlPiUKICBtdXRhdGUoQ1NBcG9pbnRjb250cmlidXRpb25Gcm9tRm9yZWlnbiA9IENTQXBvaW50Y29udHJpYnV0aW9uRnJvbUZvcmVpZ24pICU+JQogIG11dGF0ZShjc2FQT0lOVGNoYW5nZUhJU1BwcmV2ID0gY3NhUE9JTlRjaGFuZ2VISVNQcHJldikgJT4lIAogIG11dGF0ZShjc2FISVNQbWFsZVBSSU1FcHJldl8xOSA9IGNzYUhJU1BtYWxlUFJJTUVwcmV2XzE5KSAlPiUgCiAgbXV0YXRlKGNzYVBPSU5UY2hhbmdlRkVSVGZlbWFsZSA9IGNzYVBPSU5UY2hhbmdlRkVSVGZlbWFsZSkgJT4lIAogIG11dGF0ZShjc2FGRVJUZmVtYWxlUFJFVl8xOSA9IGNzYUZFUlRmZW1hbGVQUkVWXzE5KSAlPiUgCiAgbXV0YXRlKGNzYVBPSU5UY2hhbmdlV0hJVEVtYWxlRUFSTiA9IGNzYVBPSU5UY2hhbmdlV0hJVEVtYWxlRUFSTikgJT4lIAogIG11dGF0ZShjc2FXSElURW1hbGVFQVJOXzE5ID0gY3NhV0hJVEVtYWxlRUFSTl8xOSkgJT4lIAogIG11dGF0ZShjc2FQT0lOVGNoYW5nZTY1cGx1c1BSRVYgPSBjc2FQT0lOVGNoYW5nZTY1cGx1c1BSRVYpICU+JSAKICBtdXRhdGUoY3NhNjVwbHVzUFJFVl8xOSA9IGNzYTY1cGx1c1BSRVZfMTkpICU+JSAKICBtdXRhdGUoY3NhUE9JTlRjaGFuZ2VCTEFDS3lvdXRoUFJFViA9IGNzYVBPSU5UY2hhbmdlQkxBQ0t5b3V0aFBSRVYpICU+JSAKICBtdXRhdGUoY3NhQkxBQ0t5b3V0aFBSRVZfMTkgPSBjc2FCTEFDS3lvdXRoUFJFVl8xOSkgJT4lIAogIG11dGF0ZShjc2FQT0lOVGNoYW5nZUFTSUFOeW91dGhQUkVWID0gY3NhUE9JTlRjaGFuZ2VBU0lBTnlvdXRoUFJFVikgJT4lIAogIG11dGF0ZShjc2FBU0lBTnlvdXRoUFJFVl8xOSA9IGNzYUFTSUFOeW91dGhQUkVWXzE5KSAlPiUgCiAgbXV0YXRlKGNzYVBPSU5UY2hhbmdlT0NDcm1NT1JFdGhhbk9ORSA9IGNzYVBPSU5UY2hhbmdlT0NDcm1NT1JFdGhhbk9ORSkgJT4lIAogIG11dGF0ZShjc2FPQ0NybU1PUkV0aGFuT05FXzE5ID0gY3NhT0NDcm1NT1JFdGhhbk9ORV8xOSkKCiNzZjo6c3Rfd3JpdGUoanNvbm55TENTQSwgZHNuID0gIi9Vc2Vycy9jd29vZHNvbjIvRGVza3RvcC9QaG9lbml4L2pzb25ueUxDU0EuZ2VvanNvbiIsCiMgICAgICAgICAgICAgbGF5ZXIgPSAianNvbm55TENTQS5nZW9qc29uIikKCmpzb25ueUxDU0EyIDwtIGpzb25ueUxDU0EgJT4lCiAgc3Rfc2V0X2dlb21ldHJ5KC4sIE5VTEwpICU+JQogIHNlbGVjdCgtZ3JvdXApCgpjb3JyeTIgPC0gY29yKGpzb25ueUxDU0EyKQpgYGAKCiMjTWFwcGluZyBnZW9kZW1vZ3JhcGhpY3MKCmBgYHtyfQpoaXNwTWFsZV8yMDE0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDEwLCBhZXMoZmlsbCA9IGhpc3BNYWxlMjVfNTRvdmVyTWFsZTI1XzU0XzIwMTQpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJoaXNwTWFsZTI1XzU0b3Zlck1hbGUyNV81NF8yMDE0IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC00MCwxMDApLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgNSwgMTAsIDIwLCA0MCwgODApKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpoaXNwTWFsZV8yMDE5IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDEwLCBhZXMoZmlsbCA9IGhpc3BNYWxlMjVfNTRvdmVyTWFsZTI1XzU0XzIwMTkpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJoaXNwTWFsZTI1XzU0b3Zlck1hbGUyNV81NF8yMDE5IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC00MCwxMDApLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgNSwgMTAsIDIwLCA0MCwgODApKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpoaXNwTWFsZV9jaGFuZ2UgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gcG9pbnRDSEFOR0VoaXNwUFJJTUVtYWxlKSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnRDSEFOR0VoaXNwUFJJTUVtYWxlIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0xNSwyMCksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtNSwgMCwgNSwgMTAsIDE1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KY3NhSElTUG1hbGVQUklNRXByZXZfMTQgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYUhJU1BtYWxlUFJJTUVwcmV2XzE0KSkgKwogICAgIGxhYnModGl0bGUgPSAiY3NhSElTUG1hbGVQUklNRXByZXZfMTQiLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMjUpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlSElTUHByZXYgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYVBPSU5UY2hhbmdlSElTUHByZXYpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2FQT0lOVGNoYW5nZUhJU1BwcmV2IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYUhJU1BtYWxlUFJJTUVwcmV2XzE5IDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FISVNQbWFsZVBSSU1FcHJldl8xOSkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYUhJU1BtYWxlUFJJTUVwcmV2XzE5IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDI1KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpoaXNwTWFsZV8yMDE0CmBgYAoKYGBge3J9Cmhpc3BNYWxlX2NoYW5nZQpgYGAKCmBgYHtyfQpoaXNwTWFsZV8yMDE5CmBgYAoKYGBge3J9CmNzYUhJU1BtYWxlUFJJTUVwcmV2XzE0CmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlSElTUHByZXYKYGBgCgpgYGB7cn0KY3NhSElTUG1hbGVQUklNRXByZXZfMTkKYGBgCgpgYGB7cn0KZmVtYWxlMjJfMjlfMjAxNCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBmZW1hbGUyMl8yOW92ZXJGZW1hbGUxNV80OV8yMDE0KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAiZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDlfMjAxNCIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygwLDMwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDUsIDEwLCAxNSwgMjAsIDI1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KZmVtYWxlMjJfMjlfMjAxOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBmZW1hbGUyMl8yOW92ZXJGZW1hbGUxNV80OV8yMDE5KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAiZmVtYWxlMjJfMjlvdmVyRmVtYWxlMTVfNDlfMjAxOSIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygwLDMwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDUsIDEwLCAxNSwgMjAsIDI1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KcG9pbnRDSEFOR0Vwb3N0R1JBRGZlcnQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gcG9pbnRDSEFOR0Vwb3N0R1JBRGZlcnRQUkVWKSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnRDSEFOR0Vwb3N0R1JBRGZlcnRQUkVWIiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0yNSwyNSksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtMTUsIC0xMCwgLTUsIDAsIDUsIDEwLCAxNSkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CmNzYUZFUlRmZW1hbGVQUkVWXzE0IDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FGRVJUZmVtYWxlUFJFVl8xNCkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYUZFUlRmZW1hbGVQUkVWXzE0IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDI1KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpjc2FQT0lOVGNoYW5nZUZFUlRmZW1hbGUgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYVBPSU5UY2hhbmdlRkVSVGZlbWFsZSkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYVBPSU5UY2hhbmdlRkVSVGZlbWFsZSIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpjc2FGRVJUZmVtYWxlUFJFVl8xOSA8LSBnZ3Bsb3QoZGF0YSA9IExDU0FfU0hQMTAsIGFlcyhmaWxsID0gY3NhRkVSVGZlbWFsZVBSRVZfMTkpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2FGRVJUZmVtYWxlUFJFVl8xOSIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAyNSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KZmVtYWxlMjJfMjlfMjAxNApgYGAKCmBgYHtyfQpwb2ludENIQU5HRXBvc3RHUkFEZmVydApgYGAKCmBgYHtyfQpmZW1hbGUyMl8yOV8yMDE5CmBgYAoKYGBge3J9CmNzYUZFUlRmZW1hbGVQUkVWXzE0CmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlRkVSVGZlbWFsZQpgYGAKCmBgYHtyfQpjc2FGRVJUZmVtYWxlUFJFVl8xOQpgYGAKCmBgYHtyfQp3aGl0ZU1BTEU0NV81NG92ZXJNQUxFNDVfNTRfMjAxNCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSB3aGl0ZU1BTEU0NV81NG92ZXJNQUxFNDVfNTRfMjAxNCksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gIndoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE0IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0yNSwxMDApLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoNSwgMTAsIDIwLCA0MCwgODApKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQpwb2ludENIQU5HRXBlYWtXSFRtYWxlRUFSTkVSU3ByZXYgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gcG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0yNSwyNSksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtMTUsIC0xMCwgLTUsIDAsIDUsIDEwLCAxNSkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CndoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE5IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDEwLCBhZXMoZmlsbCA9IHdoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE5KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAid2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0XzIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTI1LDEwMCksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYyg1LCAxMCwgMjAsIDQwLCA4MCkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CmNzYVdISVRFbWFsZUVBUk5fMTQgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYVdISVRFbWFsZUVBUk5fMTQpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2FXSElURW1hbGVFQVJOXzE0IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDc1KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpjc2FQT0lOVGNoYW5nZVdISVRFbWFsZUVBUk4gPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYVBPSU5UY2hhbmdlV0hJVEVtYWxlRUFSTikpICsKICAgICBsYWJzKHRpdGxlID0gImNzYVBPSU5UY2hhbmdlV0hJVEVtYWxlRUFSTiIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSAwKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpjc2FXSElURW1hbGVFQVJOXzE5IDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FXSElURW1hbGVFQVJOXzE5KSkgKwogICAgIGxhYnModGl0bGUgPSAiY3NhV0hJVEVtYWxlRUFSTl8xOSIsCiAgICAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGNvbG9yID0gImxpZ2h0eWVsbG93IikgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9zdGVwczIobi5icmVha3MgPSA1LCBsb3cgPSAiZGFya2dyZWVuIiwgbWlkID0gInRhbiIsIGhpZ2ggPSAicmVkIiwgbWlkcG9pbnQgPSA3NSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0Kd2hpdGVNQUxFNDVfNTRvdmVyTUFMRTQ1XzU0XzIwMTQKYGBgCgpgYGB7cn0KcG9pbnRDSEFOR0VwZWFrV0hUbWFsZUVBUk5FUlNwcmV2CmBgYAoKYGBge3J9CndoaXRlTUFMRTQ1XzU0b3Zlck1BTEU0NV81NF8yMDE5CmBgYAoKYGBge3J9CmNzYVdISVRFbWFsZUVBUk5fMTQKYGBgCgpgYGB7cn0KY3NhUE9JTlRjaGFuZ2VXSElURW1hbGVFQVJOCmBgYAoKYGBge3J9CmNzYVdISVRFbWFsZUVBUk5fMTkKYGBgCgpgYGB7cn0KYmxhY2swXzE3b3ZlcjBfMTdfMjAxNCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBibGFjazBfMTdvdmVyMF8xN18yMDE0KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAiYmxhY2swXzE3b3ZlcjBfMTdfMjAxNCIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtMjUsMTAwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDUsIDEwLCAyMCwgNDAsIDgwKSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KcG9pbnRDSEFOR0VibGFja1lPVVRIcHJldiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBwb2ludENIQU5HRWJsYWNrWU9VVEhwcmV2KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnRDSEFOR0VibGFja1lPVVRIcHJldiIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtMTIsMjApLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTEwLCAtNSwgMCwgNSwgMTAsIDE1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KYmxhY2swXzE3b3ZlcjBfMTdfMjAxOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBibGFjazBfMTdvdmVyMF8xN18yMDE5KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAiYmxhY2swXzE3b3ZlcjBfMTdfMjAxOSIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtMjUsMTAwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDUsIDEwLCAyMCwgNDAsIDgwKSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KY3NhQkxBQ0t5b3V0aFBSRVZfMTQgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYUJMQUNLeW91dGhQUkVWXzE0KSkgKwogICAgIGxhYnModGl0bGUgPSAiY3NhQkxBQ0t5b3V0aFBSRVZfMTQiLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMjUpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlQkxBQ0t5b3V0aFBSRVYgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYVBPSU5UY2hhbmdlQkxBQ0t5b3V0aFBSRVYpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2FQT0lOVGNoYW5nZUJMQUNLeW91dGhQUkVWIiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYUJMQUNLeW91dGhQUkVWXzE5IDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FCTEFDS3lvdXRoUFJFVl8xOSkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYUJMQUNLeW91dGhQUkVWXzE5IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDI1KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpibGFjazBfMTdvdmVyMF8xN18yMDE0CmBgYAoKYGBge3J9CnBvaW50Q0hBTkdFYmxhY2tZT1VUSHByZXYKYGBgCgpgYGB7cn0KYmxhY2swXzE3b3ZlcjBfMTdfMjAxOQpgYGAKCmBgYHtyfQpjc2FCTEFDS3lvdXRoUFJFVl8xNApgYGAKICAgCmBgYHtyfQpjc2FQT0lOVGNoYW5nZUJMQUNLeW91dGhQUkVWCmBgYAoKYGBge3J9CmNzYUJMQUNLeW91dGhQUkVWXzE5CmBgYAoKYGBge3J9CmFzaWFuMF8xN292ZXIwXzE3XzIwMTQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gYXNpYW4wXzE3b3ZlcjBfMTdfMjAxNCksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gImFzaWFuMF8xN292ZXIwXzE3XzIwMTQiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTE1LDQwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDUsIDEwLCAxNSwgMjAsIDI1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KcG9pbnRDSEFOR0Vhc2lhbllPVVRIcHJldiA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBwb2ludENIQU5HRWFzaWFuWU9VVEhwcmV2KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9pbnRDSEFOR0Vhc2lhbllPVVRIcHJldiIsCiAgICAgICBjYXB0aW9uID0gIlUuUy4gQ2Vuc3VzIEJ1cmVhdSIpICsKICBnZW9tX3NmKGRhdGEgPSBTSFA1LCBmaWxsID0gTkEsIGNvbG9yID0gImRhcmtncmF5IikgKwogIGdlb21fc2YoY29sb3IgPSBOQSkgKwogIHRoZW1lX3ZvaWQoKSArCiAgc2NhbGVfZmlsbF9iaW5uZWQobGltaXRzID0gYygtOSwxMSksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygtNiwgLTIsIDAsIDIsIDYpKSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJkYXJrZ3JheSIpKQpgYGAKCmBgYHtyfQphc2lhbjBfMTdvdmVyMF8xN18yMDE5IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDEwLCBhZXMoZmlsbCA9IGFzaWFuMF8xN292ZXIwXzE3XzIwMTkpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJhc2lhbjBfMTdvdmVyMF8xN18yMDE5IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0xNSw0MCksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCA1LCAxMCwgMTUsIDIwLCAyNSkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlQVNJQU55b3V0aFBSRVYgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYVBPSU5UY2hhbmdlQVNJQU55b3V0aFBSRVYpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2FQT0lOVGNoYW5nZUFTSUFOeW91dGhQUkVWIiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYUFTSUFOeW91dGhQUkVWXzE0IDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FBU0lBTnlvdXRoUFJFVl8xNCkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYUFTSUFOeW91dGhQUkVWXzE0IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDUpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYUFTSUFOeW91dGhQUkVWXzE5IDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FBU0lBTnlvdXRoUFJFVl8xOSkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYUFTSUFOeW91dGhQUkVWXzE5IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDUpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmFzaWFuMF8xN292ZXIwXzE3XzIwMTQKYGBgCgpgYGB7cn0KcG9pbnRDSEFOR0Vhc2lhbllPVVRIcHJldgpgYGAKCmBgYHtyfQphc2lhbjBfMTdvdmVyMF8xN18yMDE5CmBgYAoKYGBge3J9CmNzYUFTSUFOeW91dGhQUkVWXzE0ICAKYGBgCgpgYGB7cn0KY3NhUE9JTlRjaGFuZ2VBU0lBTnlvdXRoUFJFVgpgYGAKCmBgYHtyfQpjc2FBU0lBTnlvdXRoUFJFVl8xOQpgYGAKCmBgYHtyfQpwb3A2NXBsdXNPVkVScG9wXzIwMTQgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gcG9wNjVwbHVzT1ZFUnBvcF8yMDE0KSwgY29sb3IgPSBOQSkgKwogIGxhYnModGl0bGUgPSAicG9wNjVwbHVzT1ZFUnBvcF8yMDE0IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC0xMCw0MCksIGhpZ2ggPSAicHVycGxlIiwgbG93ID0gInllbGxvdyIsCiAgICAgICAgICAgICAgICAgICAgYnJlYWtzID0gYygwLCA1LCAxMCwgMTUsIDIwLCAyNSkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CnBvaW50Q0hBTkdFcmV0aXJlZVBSRVYgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gcG9pbnRDSEFOR0VyZXRpcmVlUFJFViksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gInBvaW50Q0hBTkdFcmV0aXJlZVBSRVYiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTEwLDIwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKC0yLCAwLCAyLCA1LCAxMCkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CnBvcDY1cGx1c09WRVJwb3BfMjAxOSA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9zZihkYXRhID0gY291bnRpZXNTSFAxMCwgYWVzKGZpbGwgPSBwb3A2NXBsdXNPVkVScG9wXzIwMTkpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJwb3A2NXBsdXNPVkVScG9wXzIwMTkiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTEwLDQwKSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDUsIDEwLCAxNSwgMjAsIDI1KSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KY3NhNjVwbHVzUFJFVl8xNCA8LSBnZ3Bsb3QoZGF0YSA9IExDU0FfU0hQMTAsIGFlcyhmaWxsID0gY3NhNjVwbHVzUFJFVl8xNCkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYTY1cGx1c1BSRVZfMTQiLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMTUpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlNjVwbHVzUFJFViA8LSBnZ3Bsb3QoZGF0YSA9IExDU0FfU0hQMTAsIGFlcyhmaWxsID0gY3NhUE9JTlRjaGFuZ2U2NXBsdXNQUkVWKSkgKwogICAgIGxhYnModGl0bGUgPSAiY3NhUE9JTlRjaGFuZ2U2NXBsdXNQUkVWIiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDApICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImxpZ2h0eWVsbG93IikpCmBgYAoKYGBge3J9CmNzYTY1cGx1c1BSRVZfMTkgPC0gZ2dwbG90KGRhdGEgPSBMQ1NBX1NIUDEwLCBhZXMoZmlsbCA9IGNzYTY1cGx1c1BSRVZfMTkpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2E2NXBsdXNQUkVWXzE5IiwKICAgICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoY29sb3IgPSAibGlnaHR5ZWxsb3ciKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX3N0ZXBzMihuLmJyZWFrcyA9IDUsIGxvdyA9ICJkYXJrZ3JlZW4iLCBtaWQgPSAidGFuIiwgaGlnaCA9ICJyZWQiLCBtaWRwb2ludCA9IDE1KSArCiAgdGhlbWUobGVnZW5kLmp1c3RpZmljYXRpb24gPSBjKDAsIDEpLAogICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg1LCAuMzkpKSArCiAgdGhlbWUobGVnZW5kLnRpdGxlPWVsZW1lbnRfYmxhbmsoKSkgKwogIHRoZW1lKHBhbmVsLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3IgPSBGQUxTRSwgZmlsbCA9ICJsaWdodHllbGxvdyIpKQpgYGAKCmBgYHtyfQpwb3A2NXBsdXNPVkVScG9wXzIwMTQKYGBgCgpgYGB7cn0KcG9pbnRDSEFOR0VyZXRpcmVlUFJFVgpgYGAKCmBgYHtyfQpwb3A2NXBsdXNPVkVScG9wXzIwMTkKYGBgCiAgCmBgYHtyfQpjc2E2NXBsdXNQUkVWXzE0CmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlNjVwbHVzUFJFVgpgYGAKCmBgYHtyfQpjc2E2NXBsdXNQUkVWXzE5CmBgYAoKIyNvY2N1cGFudHMgcGVyIHJvb20KCmBgYHtyfQpPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE0IDwtIGdncGxvdCgpICsKICBnZW9tX3NmKGRhdGEgPSBjb3VudGllc1NIUDEwLCBhZXMoZmlsbCA9IE9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTQpLCBjb2xvciA9IE5BKSArCiAgbGFicyh0aXRsZSA9ICJPQ0Nyb29tc01PUkV0aGFuT05Fb2NjXzE0IiwKICAgICAgIGNhcHRpb24gPSAiVS5TLiBDZW5zdXMgQnVyZWF1IikgKwogIGdlb21fc2YoZGF0YSA9IFNIUDUsIGZpbGwgPSBOQSwgY29sb3IgPSAiZGFya2dyYXkiKSArCiAgZ2VvbV9zZihjb2xvciA9IE5BKSArCiAgdGhlbWVfdm9pZCgpICsKICBzY2FsZV9maWxsX2Jpbm5lZChsaW1pdHMgPSBjKC01LDE1KSwgaGlnaCA9ICJwdXJwbGUiLCBsb3cgPSAieWVsbG93IiwKICAgICAgICAgICAgICAgICAgICBicmVha3MgPSBjKDAsIDIsIDQsIDYsIDgsIDEwLCAxMikpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9CnBvaW50Q0hOR29jY1JNbW9yZVRIQU5vbmUgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gcG9pbnRDSE5Hb2NjUk1tb3JlVEhBTm9uZSksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gInBvaW50Q0hOR29jY1JNbW9yZVRIQU5vbmUiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTcsMTUpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoLTYsIC00LCAtMiwgMCwgMiwgNCkpICsKICB0aGVtZShsZWdlbmQuanVzdGlmaWNhdGlvbiA9IGMoMCwgMSksCiAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gYyguODUsIC4zOSkpICsKICB0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpKSArCiAgdGhlbWUocGFuZWwuYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvciA9IEZBTFNFLCBmaWxsID0gImRhcmtncmF5IikpCmBgYAoKYGBge3J9Ck9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTkgPC0gZ2dwbG90KCkgKwogIGdlb21fc2YoZGF0YSA9IGNvdW50aWVzU0hQMTAsIGFlcyhmaWxsID0gT0NDcm9vbXNNT1JFdGhhbk9ORW9jY18xOSksIGNvbG9yID0gTkEpICsKICBsYWJzKHRpdGxlID0gIk9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTkiLAogICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihkYXRhID0gU0hQNSwgZmlsbCA9IE5BLCBjb2xvciA9ICJkYXJrZ3JheSIpICsKICBnZW9tX3NmKGNvbG9yID0gTkEpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfYmlubmVkKGxpbWl0cyA9IGMoLTUsMTUpLCBoaWdoID0gInB1cnBsZSIsIGxvdyA9ICJ5ZWxsb3ciLAogICAgICAgICAgICAgICAgICAgIGJyZWFrcyA9IGMoMCwgMiwgNCwgNiwgOCwgMTAsIDEyKSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAiZGFya2dyYXkiKSkKYGBgCgpgYGB7cn0KY3NhT0NDcm1NT1JFdGhhbk9ORV8xNCA8LSBnZ3Bsb3QoZGF0YSA9IExDU0FfU0hQMTAsIGFlcyhmaWxsID0gY3NhT0NDcm1NT1JFdGhhbk9ORV8xNCkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYU9DQ3JtTU9SRXRoYW5PTkVfMTQiLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gNSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KY3NhUE9JTlRjaGFuZ2VPQ0NybU1PUkV0aGFuT05FIDwtIGdncGxvdChkYXRhID0gTENTQV9TSFAxMCwgYWVzKGZpbGwgPSBjc2FQT0lOVGNoYW5nZU9DQ3JtTU9SRXRoYW5PTkUpKSArCiAgICAgbGFicyh0aXRsZSA9ICJjc2FQT0lOVGNoYW5nZU9DQ3JtTU9SRXRoYW5PTkUiLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gMCkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KY3NhT0NDcm1NT1JFdGhhbk9ORV8xOSA8LSBnZ3Bsb3QoZGF0YSA9IExDU0FfU0hQMTAsIGFlcyhmaWxsID0gY3NhT0NDcm1NT1JFdGhhbk9ORV8xOSkpICsKICAgICBsYWJzKHRpdGxlID0gImNzYU9DQ3JtTU9SRXRoYW5PTkVfMTkiLAogICAgICAgICAgY2FwdGlvbiA9ICJVLlMuIENlbnN1cyBCdXJlYXUiKSArCiAgZ2VvbV9zZihjb2xvciA9ICJsaWdodHllbGxvdyIpICsKICB0aGVtZV92b2lkKCkgKwogIHNjYWxlX2ZpbGxfc3RlcHMyKG4uYnJlYWtzID0gNSwgbG93ID0gImRhcmtncmVlbiIsIG1pZCA9ICJ0YW4iLCBoaWdoID0gInJlZCIsIG1pZHBvaW50ID0gNSkgKwogIHRoZW1lKGxlZ2VuZC5qdXN0aWZpY2F0aW9uID0gYygwLCAxKSwKICAgICAgICBsZWdlbmQucG9zaXRpb24gPSBjKC44NSwgLjM5KSkgKwogIHRoZW1lKGxlZ2VuZC50aXRsZT1lbGVtZW50X2JsYW5rKCkpICsKICB0aGVtZShwYW5lbC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG9yID0gRkFMU0UsIGZpbGwgPSAibGlnaHR5ZWxsb3ciKSkKYGBgCgpgYGB7cn0KT0NDcm9vbXNNT1JFdGhhbk9ORW9jY18xNApgYGAKCmBgYHtyfQpwb2ludENITkdvY2NSTW1vcmVUSEFOb25lCmBgYAoKYGBge3J9Ck9DQ3Jvb21zTU9SRXRoYW5PTkVvY2NfMTkKYGBgCiAgCmBgYHtyfQpjc2FPQ0NybU1PUkV0aGFuT05FXzE0CmBgYAoKYGBge3J9CmNzYVBPSU5UY2hhbmdlT0NDcm1NT1JFdGhhbk9ORQpgYGAKCmBgYHtyfQpjc2FPQ0NybU1PUkV0aGFuT05FXzE5CmBgYAoKIyMgay1tZWFucyBhbmQgcmVnaW9uYWxpemUKCiMjIG5vdGUgZm9yIGxhdGVyOiBjaGFuZ2Ugc2NhbGUgb24gY291bnR5IG1pZ3JhdGlvbiBtYXBzIA==